举个可能并不恰当的例子
你去买咖啡,当然你可以选择普通的黑咖啡(什么也不加,相当于基类)。但相信大多数人都喜欢加点牛奶,加点奶泡等等。这时候我们怎么生产对应的类型的咖啡呢?进而应该付多少钱?(如何产生对应类型的子类实例)
首先,我们当然可以分别写出这几种类,反正就这么几种呗,组合一下很轻松,但这样做显然是不可扩展的,而且也不宜与维护,比如有一天牛奶价格上涨了,你需要把所有的子类的价格统统修改一遍;又比如我想喝加双倍牛奶的,怎么付钱就是个问题了。显然这么设计违背了设计规则,我们没有把变化的部分和不变的部分分离,同时也没有针对抽象编程而是基于实现编程。那么如何改进?
自然地,装饰者模式诞生了
首先我们设计一种抽象类,他表示“咖啡”,所有的种类的咖啡都继承自他(实现其内部的抽象方法,计算价格),之后我们再生成一个配料(装饰者)抽象类,我们每增加一种配料,都包装一次目前已经获得的类,比如我们要一杯加牛奶和奶泡的摩卡,我们就先生成一杯摩卡再添加牛奶,这样我们就得到一个牛奶摩卡,再把牛奶摩卡中加入奶泡,我们希望得到的对象就诞生了
总结一下,我们要做的是两个抽象类,分别是抽象基类和抽象装饰者,之后的所有具体实现都是对这两个抽象类的实现。
值得注意的是,抽象装饰者类要继承抽象基类以满足我们的需求,因为我们希望在添加装饰之后,我们对象的基类型是保持不变的(仍然是咖啡),可能有人就问了,这不是违背了继承的原则么,这些装饰者也不是基类啊,我总不能认为奶泡是咖啡,这显然不合逻辑。我最开始也有这个疑问,但是转念一想,我们可以把装饰者对象认为是一个有装饰者对象的基类型对象,(一杯有奶泡的咖啡,而不是奶泡),这样就解释通了,也解释了为什么装饰类要继承基类。
委托像是一台机器,每一种修饰像是一个零件,他们各司其职;而装饰者模式像是包装礼品,用修饰类一层一层的包裹以达到最终的功能。
原文:https://www.cnblogs.com/owczhlol/p/12817669.html