结构型模式:Decorator 装饰者模式
目录

装饰器模式:动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

设计原则:类应该对扩展开放,对修改关闭

装饰者和被装饰者拥有相同的超类。 用一个或多个装饰者包装一个对象。 装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的。 对象可以在任何时候被装饰,所以可以在运行时动态地、不限量地用你喜欢的装饰器来装饰对象。 组合和委托可用于在运行时动态地加上新的行为。

AbstractDecorator {
virtual int fun() = 0;
}


DecorateOne: public AbstractDecoraor {
public:
DecorateOne():ad(null){};
Decorate(AbstractDecorator *ad) {this->ad = ad;}
virtual int fun() {if (ad!=null) return 1+ad->fun(); else return 1;}
private:
AbstractDecorator *ad;
};

DecorateTwo: public AbstractDecoraor {
public:
DecorateTwo():ad(null){};
Decorate(AbstractDecorator *ad) {this->ad = ad;}
virtual int fun() {if (ad!=null) return 2+ad->fun(); else return 2;}
private:
AbstractDecorator *ad;
};

装饰器必须实现公共的接口,以便后续的装饰器能访问前面的装饰器。 装饰器之间的可以相互组合:

AbstractDecorator ad1 = new DecorateOne(new DecorateOne);
AbstractDecorator ad2 = new DecorateOne(new DecorateTwo);
AbstractDecorator ad3 = new DecorateTwo(new DecorateOne);
AbstractDecorator ad4 = new DecorateTwo(new DecorateTwo);
AbstractDecorator ad5 = new DecorateOne(new DecorateTwo(new DecorateOne));

Java I/O就采用了装饰者模式,所有的输入类都是包装InputStream的。 FileInputStream -> BufferedInputStream -> LineNumberInputStream

装饰者模式的缺点是会导致设计中出现许多小对象,如果过度使用,会让程序变得很复杂。

发表评论