装饰器模式中的四种角色:
1、被装饰对象(Bread);
2、装饰对象(四种);
3、装饰器(Decorator);
4、公共接口或抽象类(Ingredient)。
其中1和2是系统或者实际存在的,3和4是实现装饰功能需要的抽象类。
装饰器模式的特征
装饰器角色持有一个构件对象的实例,并实现了抽象构件的接口。每一个接口的实现都是委派给所持有的构件对象,并增加新的功能。
装饰器模式优点
装饰器与继承的目的都是扩展对象的功能,但装饰器提供了比继承更大的灵活性,可以动态的决定是‘粘上’还是‘去掉’一个装饰。通过使用不同的具体装饰类和这些类的排列组合,可以创建出很多不同行为的组合。
装饰器模式的缺点
装饰器比继承关系使用更少的类,但比继承关系使用更多的对象,更多的对象会使查错变得更困难,特别是这些对象看上去很像的时候。
为什么使用Decorator
通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生成很多子类,增加系统的复杂性,同时,使用继承实现功能拓展,我们必须可预见这些拓展功能,这些功能是编译时就确定了,是静态的。使用Decorator的理由是:这些功能需要由用户动态决定加入的方式和时机。Decorator提供了‘即插即用’的方法,在运行期间决定何时增加何种功能。
装饰器模式与适配器模式的区别
装饰器模式与适配器模式都叫做包装模式(Warpper),但装饰器与被装饰具有相同的接口(具体表现为都实现想同的Java Interface或装饰器是被装饰类的子类等)。但适配器与被适配的类具有不同的接口(虽然可能用部分重合的API)如BufferedReader是一个Decorator因为它接受一个Reader对象,但是InputStreamReader它接受一个InputStream对象,把InputStream的API转换成Reader的API。半装饰器(退化了的装饰器)如果一个Decorator除了提供被装饰类的接口外还提供了另外的方法,就变成了一个半透明的装饰器,客户如果要使用这个特殊的方法说要使用具体的装饰器类,这样就违背了装饰器模式的使用初衷,但实际应用往往无法避免
装饰器模式
最新推荐文章于 2024-08-15 23:25:43 发布