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

星巴兹咖啡的故事

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

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

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

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

开放封闭原则

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

装饰者模式

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

敲黑板:

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

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

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

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

设计的类图

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

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

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

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

总结

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

OO模式:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值