“学习OO好榜样”之Decorator模式

外部接口没有变化,但内部实现“偷偷”变化了。其实也不是“偷偷”,更应该光明正大地告诉人家,你是经过装饰的,虽然都有“显示鼻子”的接口方法,但你的鼻子可能是垫了东西的。
需要注意的是,修饰过的类和被修饰的类是同类的。比如,实现相同的接口。
装饰过的类要拥有一个未被装饰类的属性。即关联关系。(合成还是聚合我就懒得区分了。)
装饰过的类的方法通常要在未被装饰类的方法基础上做点手脚,以体现装饰。

顺着脑子想到的一个例子,接口PriceGetter,定义了一个方法int getPrice()。
CommonPriceGetter是实现该接口、正常计算价格的。而95DiscountPriceGetter也实现PriceGetter接口,只是计算出来的价格都是打过95折的。具体实现也很容易想到,95DiscountPriceGetter类拥有一个PriceGetter类型的属性,实例化时候塞一个CommonPriceGetter实例给他,getPrice方法在该实例同名方法返回值的基础上乘以0.95返回,即达到目的。
客户端可以任意选择使用那个类实例计算价格,但都是PriceGetter接口的实例,客户端是依赖于抽象的。

书中关于Adapter与Decorator区别的描述也有点意思。
前者是做手脚把让已有类满足其他接口;后者是在已有类实现接口不变的情况下,做手脚使得方法实现发生变化。前者是芯子不变换外观,后者是外观不变换芯子。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值