设计模式 - 浅谈装饰模式

装饰模式

模式功能说明:它可以让你动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性。

模式思路与原理

装饰者(Decorator)具体组件(ConcreteComponent)都继承自组件(Component),具体组件的方法实现不需要依赖于其它对象,而装饰者组合了一个组件,这样它可以装饰其它装饰者或者具体组件。所谓装饰,就是把这个装饰者套在被装饰者之上,从而动态扩展被装饰者的功能。装饰者的方法有一部分是自己的,这属于它的功能,然后调用被装饰者的方法实现,从而也保留了被装饰者的功能。

代码示例

// Component组件 -> Pizza接口
public interface Pizza {
    String getDescription();
    double getCost();
}

// ConcreteComponent具体组件 -> BasicPizza实现类
public class BasicPizza implements Pizza {
    @Override
    public String getDescription() {
        return "Basic Pizza";
    }

    @Override
    public double getCost() {
        return 5.0;
    }
}

// Decorator装饰者 - > CheeseDecorator
public class CheeseDecorator implements Pizza {
    private Pizza pizza;

    public CheeseDecorator(Pizza pizza) {
        this.pizza = pizza;
    }

    @Override
    public String getDescription() {
        return pizza.getDescription() + ", Cheese";
    }

    @Override
    public double getCost() {
        return pizza.getCost() + 1.5;
    }
}

// Decorator装饰者 - > TomatoSauceDecorator
public class TomatoSauceDecorator implements Pizza {
    private Pizza pizza;

    public TomatoSauceDecorator(Pizza pizza) {
        this.pizza = pizza;
    }

    @Override
    public String getDescription() {
        return pizza.getDescription() + ", Tomato Sauce";
    }

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

我们可以通过装饰者为Pizza添加新的行为,而无需修改Pizza接口BasicPizza类

总结

装饰模式的主要原则是开闭原则,即对扩展开放,对修改关闭。在装饰模式中,我们可以通过创建新的装饰类来增加新的行为,而无需修改现有的类。
装饰者和被装饰者之间必须是一样的类型,也就是要有共同的超类。在这里应用继承并不是实现方法的复制,而是实现类型的匹配。因为装饰者和被装饰者是同一个类型,因此装饰者可以取代被装饰者,这样就使被装饰者拥有了装饰者独有的行为。根据装饰者模式的理念,我们可以在任何时候,实现新的装饰者增加新的行为。


本文链接:

https://pugqq.com/archives/decoration-pattern.html
设计模式 - 浅谈装饰模式 - I/O
快来做第一个评论的人吧~

# 最近更新

Nginx的proxy_pass指令完全拆解2021-03-21

Nginx配置Jenkins域名访问2021-01-03

设计模式 - 浅谈备忘录模式2020-12-02

设计模式 - 浅谈中介者模式2020-11-23

设计模式 - 浅谈迭代器模式2020-11-02

MySQL5.7 字符集设置2020-10-26

设计模式 - 浅谈状态模式2020-10-23

设计模式 - 浅谈访问者模式2020-10-13

设计模式 - 浅谈观察者模式2020-10-12

设计模式 - 浅谈命令模式2020-09-21