《java与模式》-13 装饰模式

来源:互联网 发布:nosql数据库那个最火 编辑:程序博客网 时间:2024/06/05 22:45

装饰模式也叫包装模式;
装饰模式以对客户透明的方式动态的给一个对象附加上更多责任,客户端不会觉得对象在装饰前和装饰后有什么不同,装饰模式可以在不使用创建跟多子类的情况下,将对象功能加以扩展;
这里写图片描述
装饰模式常常被称作包裹模式,每一个具体装饰类都将下一个具体装饰类或具体构件类包起来,每一层包裹都提供了一些新的功能;
ConcreteDecorator3将ConcreteDecorator2包起来,ConcreteDecorator2又将ConcreteDecorator包起来,ConcreteDecorator又将ConcreteComponent(具体构件类)包起来;

        Component component = new ConcreteComponent();        new ConcreteDecorator3(                new ConcreteDecorator2(                        new ConcreteDecorator(component)                )        ).sampleOperation();

装饰模式的使用场景:

  1. 需要扩展一个类的功能,或给一个类增加责任;
  2. 需要动态的给一个对象增加功能,这些功能可以动态的撤销;
  3. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变得不显示;

优点:

  1. 装饰模式和继承都是为了扩展对象的功能,但装饰模式可以提供比继承更多的灵活性;装饰模式允许系统动态的贴上一个需要的装饰,或去除一个装饰。继承是静态的,系统运行前就决定了;
  2. 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合;继承没有这个优势每一种排列组合都需要事先通过子类继承的方式设计好;
  3. 这种比继承灵活的特性,意味着比继承容易出错,不同装饰类在排列组合时不产生不合理的排列组合,制造出错误

缺点:装饰模式可以比使用继承需要更少数目的类,少数的类使设计容易进行。但是会产生比继承更多的对象,更多的对象会使查错变得困难。特别这些对象看上去都很相像;

原创粉丝点击