装饰器模式

装饰器模式

什么是装饰器模式:

是一种结构型设计模型,允许在不改变对象结构的情况下,动态的将新的功能添加到对象上,

核心思想:

通过组合而非继承的方式来实现功能扩展。他可以在运行时动态的添加活移除对象的功能,而无需修改原始对象的代码。

解决的问题:

继承关系过于复杂的问题,通过组合来代替继承。

使用场景:

用于扩展一个类的功能,或者给一个类添加附加职责
动态的给一个对象添加功能,这些功能可以动态的被撤销
需要为一批平行的兄弟类进行改造或者加装功能

案例:为咖啡添加作料

咖啡接口

package Decorator;

/**
 * 抽象咖啡类
 */
public interface Coffee {

    double getCost();

    String getDescription();
}

装饰器抽象类

package Decorator;

/**
 * 装饰器抽象类
 */
public abstract class CoffeeDecorator implements Coffee {

    //静态代理
    /**
     * 静态代理:
     * 创建目标  创建代理对象  将目标传给代理对象
     */
    protected final Coffee decoratorCoffee;

    public CoffeeDecorator(Coffee decoratorCoffee) {
        this.decoratorCoffee = decoratorCoffee;
    }

    @Override
    public double getCost() {
        return decoratorCoffee.getCost();
    }

    @Override
    public String getDescription() {
        return decoratorCoffee.getDescription();
    }
}

普通咖啡类:

package Decorator;

/**
 * 基础咖啡类
 */
public class SimpleCoffee implements Coffee{
    @Override
    public double getCost() {
        return 1.0;
    }

    @Override
    public String getDescription() {
        return "Simple coffee";
    }
}

牛奶装饰器类

package Decorator;

/**
 * 牛奶装饰器
 */
public class MilkDecorator extends CoffeeDecorator {

    public MilkDecorator(Coffee decoratorCoffee) {
        super(decoratorCoffee);
    }

    @Override
    public double getCost() {
        return super.getCost() + 0.5;
    }

    @Override
    public String getDescription() {
        return super.getDescription() + "with milk";
    }

}

糖浆装饰器类

package Decorator;

/**
 * 糖浆装饰器
 */
public class SyrupDecorator extends CoffeeDecorator{

    public SyrupDecorator(Coffee decoratorCoffee) {
        super(decoratorCoffee);
    }

    @Override
    public double getCost() {
        return super.getCost() + 1;
    }

    @Override
    public String getDescription() {
        return super.getDescription() + "with 糖浆";
    }

}

测试类:

package Decorator;

public class Client {

    public static void main(String[] args) {

        //基本咖啡
        Coffee simpleCoffee = new SimpleCoffee();
        System.out.println("simpleCoffee" + simpleCoffee.getDescription() + ",cost:" + simpleCoffee.getCost());

        //咖啡 + 牛奶
        Coffee milkCoffee = new MilkDecorator(simpleCoffee);
        System.out.println("milkCoffee:" + milkCoffee.getDescription() + ",cost:" + milkCoffee.getCost());

        //咖啡 + 牛奶 + 糖
        Coffee syrupCoffee = new SyrupDecorator(milkCoffee);
        System.out.println("syrupCoffee + milkCoffee:" + syrupCoffee.getDescription() + ",cost:" + syrupCoffee.getCost());

    }

}

装饰器模式_第1张图片
项目地址: https://gitee.com/htzGittee/design-patterns/tree/master/designPatterns

你可能感兴趣的:(设计模式,装饰器模式,java,开发语言)