Head First设计模式系列三:装饰者模式

星巴兹咖啡的故事

我们有一个饮料抽象类,各种类型的咖啡继承这个饮料类

Head First设计模式系列三:装饰者模式_第1张图片

此外我们还有各种调料,调料不同收费也不一样,如果每一种都设计成一个子类,那么就会有很多的类

将各种调料写入超类中,超类计算调料的价格

Head First设计模式系列三:装饰者模式_第2张图片

问题在于,如果有新的调料,那么又要修改超类代码,或者有人点了2份相同的调料,代码就会有问题。

开放封闭原则

类应该对扩展开放,对修改封闭

装饰者模式

拿一个深培咖啡对象--以摩卡对象装饰它--以奶泡对象装饰它--调用cost方法,并依赖委托将调料的价格加入。

Head First设计模式系列三:装饰者模式_第3张图片

敲黑板:

装饰者和被装饰对象有相同的超类型;

因为有相同的超类型,所以在任何需要原始对象的场合都可以使用装饰过的对象代替它;

装饰者可以在所委托被装饰者的行为之前或之后,加上自己的行为,以此来达到增强被装饰者的目的;

对象可以在任何时候被装饰,所以可以在运行时动态、不限量的用你喜欢的装饰者来装饰对象。

Head First设计模式系列三:装饰者模式_第4张图片

设计的类图

Head First设计模式系列三:装饰者模式_第5张图片

Head First设计模式系列三:装饰者模式_第6张图片

上面的代码体现了装饰类和被装饰类都有一个相同的超类,在使用被装饰类的地方都可以用装饰类代替,在装饰类里面可以增强被装饰类的方法。

我记得在web的学习中,关于数据库连接池和连接对象就使用了装饰者模式。连接池的关闭并没有真正关闭连接而是返回给了连接池。

当时说的是:是你(超类型),还有你(被装饰对象),一切依靠你(调用被装饰对象,只是增强了一部分)。

真实世界的装饰者:java I/O

Head First设计模式系列三:装饰者模式_第7张图片

总结

OO原则:对扩展开放,对修改封闭

OO模式:

装饰者模式:动态地将责任附加到对象上。想要扩展功能,装饰者提供了有别于继承的另一种选择。

你可能感兴趣的:(java设计模式,java基础,设计模式)