`
王杲杲
  • 浏览: 43682 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

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

 
阅读更多

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

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

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics