原创作者: 王杲杲   阅读:1018次   评论:0条   更新时间:2011-05-26    

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

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

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

评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

文章信息

Global site tag (gtag.js) - Google Analytics