设计模式 - 浅谈装饰模式

装饰模式

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

模式思路与原理

装饰者(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
快来做第一个评论的人吧~

# 最近更新

JDK国内镜像加速下载2023-05-02

博客评论系统增加悄悄话/匿名留言模式2023-04-10

博客评论系统引入极验api2023-03-22

博客评论系统表情栏优化2023-02-04

centos用firewalld开放端口2022-08-12

数据结构与算法之红黑树2022-03-12

数据结构与算法之字典树2022-03-02

数据结构与算法之LSM树2022-02-24

数据结构与算法之B+树2022-02-15

数据结构与算法之堆2022-02-12