设计模式学习002——装饰者模式

来源:互联网 发布:被优化掉是什么 编辑:程序博客网 时间:2024/06/11 23:59

设计模式中有一个黄金法则:慎用继承,多用组合。

如果使用继承,一旦需求改变,这个时候一般都需要去改代码。这样就会造成耦合性太高,维护成本加大。但是使用组合,则可以很好的来解决一些问题。

关于装饰者有五条规则:

第一:装饰者和被装饰者对象要有相同的超类型。这样把被装饰者包装者的被装饰者给别人看的时候,才不会引起类型混乱。

第二:一个被装饰者可以被多个装饰者进行多次包装。

第三:既然装饰者和被装饰者有相同的超类型,所以任何需要原始对象的场合,可以用装饰过的对象代替他。

第四:装饰者可以再所委托被装饰者的行为之前/后加上自己的行为,以达到特定的目的。

第五:对象可以在任何时候被装饰,也可以在任何时候动态的不限量的用你喜欢的装饰者来装饰被装饰的对象。

比如:我们熟悉的IO包中的大量类的设计就是遵循这个原则。我们常常会使用 InputStream in = new BufferInputStream(new FileInputStream("xxx.xx"));来取得一个输入流对象。这就是用到了包装器模式,一般包装在被包装对象外面的那层包装器会提供一些额外的功能,比如功能增强等。


最后,提一个关于这个设计模式的两个弊端,一个弊端就是:由于包装器类的产生,会产生更多的小类,类的数量增多了,理解就麻烦了。第二个弊端就是如果包装器中的被包装对象的引用如果是针对具体类型,就会出问题。

那会出什么问题呢? 想一下,如果包装器A中的引用的被包装类型如果不是超类型(InputStream),而是一个具体的子类(比如FileInputStream)。这个时候,说先如果我传给包装器A的是一个StringBufferInputStream的就不行。而且,如果在包装器A中给被引用的被包装对象赋值的Set方法中设置的是接受一个InputStream超类型的变量,还不可以直接付给FileInputStream类型的实例变量,必须进行类型装换,不然报错。但是如果进行了类型装换,有让包装器对象失去了一般性。得不偿失。

0 0