设计模式(九):装饰者模式
优点:
① 可以提供比继承更多的灵活性,原有代码无须变动,只是在原对象上装饰一层“外衣”。
② 可以动态扩展一个对象的功能,在运行时选择不同的装饰器,从而实现不同的行为。
缺点:
① 会产生很多的小对象,增加了系统的复杂性
② 比继承更加灵活,同时意味着比继承更易出错,排错也困难,对于多次装饰的对象,可能需要逐级排查。
适用范围:
在不影响其他对象的情况下,动态、透明的为特定对象添加新功能,同时也可动态撤销新功能。
当不能采用继承的方式对系统进行扩充或者采用继承不利于系统扩展和维护时。
客户端:
ConcreteComponent c = new ConcreteComponent(); //待装饰对象
Decorator a = new ConcreteDecoratorA(); //装饰1
Decorator b = new ConcreteDecoratorB(); //装饰2
a.SetComponent(c); //装饰1加入对象c
b.SetComponent(a); //装饰2加入对象c(已含装饰1)
b.Operation(); //全部展示
一句话概括:在不影响其他对象的情况下,为原有对象添加“新的衣服”。
/** * Component (待装饰对象接口,含执行方法) * ConcreteComponent (待装饰对象实例化) * * Decorator (装饰抽象类,继承了Component接口,且有Component属性) * ConcreteDecoratorA ConcreteDecoratorB (两个装饰实例,为Component的执行方法添加新内容) */