大话设计模式—装饰模式

装饰模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

大话设计模式中程杰老师给出的定义,装饰模式:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。

装饰模式结构图如下:

关键代码:

1、Component 类充当抽象角色,不应该具体实现。

2、修饰类引用和继承 Component 类,具体扩展类重写父类方法。

我们通过下面的实例来演示装饰模式的用法。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。

类图如下:

//抽象Shape接口,可以给这些对象添加职责
package com.dfcDemo;

public interface Shape {
    public abstract void draw();
}
//具体形状对象,可以给这些对象添加职责
package com.dfcDemo;

public class Circle implements Shape{

    @Override
    public void draw() {

        System.out.println("shape:circle.");

    }

}
//具体形状对象,可以给这些对象添加职责
package com.dfcDemo;

public class Rectangle implements Shape{

    @Override
    public void draw() {

        System.out.println("shape:rectangle.");

    }

}
package com.dfcDemo;
/**
 * Shape接口的抽象装饰类
 * @author lmb
 *
 */
public abstract class ShapeDecorator implements Shape{

    public Shape decoratedShape;

    //ShapeDecorator类中要向构造方法传入一个被装饰的对象
    public ShapeDecorator(Shape decoratedShape){
        this.decoratedShape = decoratedShape;
    }

    @Override
    public void draw() {
        decoratedShape.draw();
    }

}
//Shape接口的具体装饰类,继承自抽象装饰类SHapeDecorator
package com.dfcDemo;

public class RedShapeDecorator extends ShapeDecorator{

    public RedShapeDecorator decoratedShape;

    //构造方法传入一个被装饰的Shape对象
    public RedShapeDecorator(Shape decoratedShape) {
        super(decoratedShape);
    }

   @Override
   public void draw() {
      decoratedShape.draw();//画出一个图形
      setRedBorder(decoratedShape);//为这个图形加一个红色的边框
   }

    //Shape接口抽象装饰类的子类RedShapeDecorator特有的一个装饰Shape实现类的装饰方法
    private void setRedBorder(Shape decoratedShape){
          System.out.println("Border Color: Red");
    }

}

//测试类
package com.dfcDemo;

public class TestDecorator {

    public static void main(String[] args) {

      Shape circle = new Circle();
      Shape redCircle = new RedShapeDecorator(new Circle());
      Shape redRectangle = new RedShapeDecorator(new Rectangle());

      System.out.println("Circle with normal border");
      circle.draw();//1、画图形  

      System.out.println("\nCircle of red border");
      redCircle.draw();//1、画图形  2、加红色边框

      System.out.println("\nRectangle of red border");
      redRectangle.draw();//1、画图形  2、加红色边框

    }

}

运行结果:

Circle with normal border
shape:circle.

Circle of red border
shape:circle.
Border Color: Red

Rectangle of red border
shape:rectangle.
Border Color: Red

在该实例中装饰模式是利用setBorder()来对对象进行包装。这样每个装饰对象的实现就和如何使用这个对象分离开了,每个装饰对象只关心自己的功能,不需要关心如何被添加到对象链中。

装饰模式是为已有的功能动态地添加更多功能的一种方式。但到底我们什么时候能用到呢?

当系统需要新功能的时候,是向旧的类中添加新的代码。这些新加的代码通常装饰了原有类的核心职责和行为,比如用红色边框装饰Circle和Rectangle,但这种做大的问题在于,他们在主类中加入了新的字段、新的方法和新的逻辑,从而增加了主类的复杂度,就像起初的那个Shape类,而这些新加入的东西仅仅是对了满足一些只在某种特定情况下才会执行的特殊行为的需要。而装饰模式却提供了一个非常好的解决方案,它把每个要装饰的功能放在单独的类中,并让这个类包装它所要的对象,因此,当需要执行特殊行为时,客户端代码就可以在运行时根据需要有选择的、按顺序的使用装饰功能包装对象。

这样我们可以总结出:

装饰模式的优点:把类中的装饰功能从类中去掉,这样可以简化原有的类,这样就能有效的把类的核心职责和装饰功能区分开了,而且可以去除相关类中重复的装饰逻辑;简而言之,装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

装饰模式的缺点:多层装饰比较复杂。

使用场景: 1、扩展一个类的功能。 2、动态增加功能,动态撤销。

注意事项:可代替继承

时间: 2024-08-17 15:35:16

大话设计模式—装饰模式的相关文章

大话设计模式-装饰模式(C++)

<大话设计模式>的装饰模式的C++实现. 结构图: Decorator.h: #ifndef _DECORATOR_H #define _DECORATOR_H #include <iostream> #include <string> using namespace std; //ConcreteComponent类 class CPerson { public: CPerson(){}; CPerson(string str):m_sName(str){}; vir

大话设计模式---装饰模式

装饰模式:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活. 如果只有一个ConcreteComponent类而没有抽象的Component类,那么Decorator类可以是ConcreteComponent的一个子类.同样道理,如果只有一个ConcreteDecorator类,那么就没有必要建立一个单独的Decorator类,而可以把Decorator和ConcreteDecorator的责任合并成一个类. 总结:当系统需要新功能的时候,是向旧的类中添加新的代码.

大话设计模式--装饰模式 C++简单例子

装饰模式在对象动态增加功能方面优于继承,用装饰模式替代继承,比继承更加灵活. 小菜扮靓第三版 class person { public: virtual void show(){ cout << "汤姆: " ; } }; class decorator :public person { public: person *m_a;//被装饰者 void decorate(person* a){ m_a = a; } //void show(){ // if (m_a !=

【大话设计模式】设计模式系统学习大合集

转载请注明出处:http://blog.csdn.net/column/details/designpatternbylmb.html 为了方便各位网友学习以及方便自己复习之用,将设计模式的系列内容按照由浅入深的学习顺序总结如下,点击相应的标题即可跳转到对应的文章. 大话设计模式-工厂模式 大话设计模式-单例模式 大话设计模式-原型模式 深复制VS浅复制(MemberwiseClone方法介绍) 大话设计模式-代理模式 大话设计模式-中介者模式 大话设计模式-策略模式 大话设计模式-装饰模式 大

大话设计模式_装饰模式(Java代码)

装饰模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活. 简单描述:1一个父类A(主要给各具体装饰者可以设置待装饰对象),1个具体待装饰类(继承于父类A),1个抽象装饰者(继承父类A),多个具体装饰者(继承抽象装饰者).装饰者持有父类A的引用,每个装饰者在调用方法时都先调用持有的引用的对应方法,另外可在方法中再添加自己的功能(貌似描述得比较复杂,其实就是一传一,每个中间者都可以添加自身的功能) 大话设计模式中的截图: Component是定义一个对象接口,可以给

大话设计模式C++版——装饰模式

女人常说男人喜新厌旧,只见新人笑,那闻旧人哭,但装饰模式(Decorator)却是一种结交新朋友不忘老朋友的设计模式,非常适合去古代当老公(现代是不行的,因为只能娶一个老婆了).装饰模式的本质是每一个装饰对象都被保留一个被其装饰的对象,装饰对象在展示新功能时会同时去调用被其装饰的对象的同功能函数,通过如此层层包含调用(即装饰),形成一个类似链表的结构,接下来的介绍中,我们还会看到更多的类似链表结构的设计模式,比如职责链模式.状态模式. 仍以<大话设计模式>一书中装饰模式的小菜穿衣的例子为例,来

学习大话设计模式06_装饰模式

装饰模式(Decorator): 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活. 1 /** 2 * Component 是定义一个对象接口,可以给这些对象动态地添加职责 3 * @author Monica 4 * 5 */ 6 public abstract class Component { 7 public abstract void Operation(); 8 } 9 10 11 /** 12 * ConcreteComponent 是定义了一个具体

&lt;三&gt;读《《大话设计模式》》之装饰模式

学习这个模式比前几个要难点了,搞了半天才弄懂.好吧,也许是我脑子慢 装饰者模式:装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. <<大话设计模式>>一书中以"小菜"去约会需要打扮为例子来展开学习装饰模式的,对于该模式,本人的理解是:就是对一个已有的算法进行二次加工,但又不改变原来的代码,在原有的数据处理中再一次进行处理. 好了不多说,通过代码去理解会更好一点,本人代码中的注解很关键

大话设计模式读书笔记--设计模式总结

前言 大话设计模式看了两遍,之前看过一遍,理解的不深刻, 这次用了一个月多点的时间再次温习,利用下班后的时间回来学习,把学习心得记录下来,加深了对面向对象的理解 之前是看到一个需求搞清楚业务流程之后立刻就去做了,很少从设计层面的角度考虑,现在在开发程序时,开始有了设计的思想,也有了达到可维护,可复用,可扩展目的具体的实现方法 每当看到经过优化代码的效果时,就想起一句话:精彩的代码是如何想出来的,比看到精彩的代码更加令人兴奋 下面是用自己的话进行的总结,以便加深记忆和理解 创建型 抽象工厂 定义: