zoukankan      html  css  js  c++  java
  • 设计模式-装饰者模式

    装饰者模式

        在OO设计和开发过程,当我们需要为一个已经定义好的类添加新的职责(操作),通常情况下我们会采用继承的方式定义好自己的类,但是采取这样的方式会带来一些问题。

       为了多态,通过父类指针指向其具体子类,但是这会造成另一问题:当我们需要为子类添加新的职责,就必须向其父类添加一个这个功能的抽象接口,否则通过父类指针无法调用这个方法了。这样处于高层的父类就含有太多的的方法,并且继承自这个父类的所有子类都不可避免继承了父类的这些接口,但是这些可能并不是所有子类所需要的。

    为此我们采用组合的方式而不是继承方式,当需要添加一个操作的时候就可以通过Decorator模式来解决。装饰模式通过一个包装对象,以对客户端透明的方式动态地给一个对象附加上更多的责任。

         

    装饰者模式的角色:

           抽象构件角色(Component):给出一个抽象接口,以规范准备接受附加责任的对象.

           具体构件角色(Concrete Component):定义将要接受附加责任的类.

           装饰角色(Decorator):持有一个构件(Component)对象的引用,并定义一个与抽象接口一致的接口.

           具体装饰角色(Concrete Decorator):负责给构件对象添加附加的责任.

    装饰者模式典型结构图:

           

    装饰者模式的程序实例:

         

    #include <iostream>
    #include <string>
    using namespace std;
    
    //抽象构件
    class Component{
    public:
         Component(){};
         ~virtual Component(){};
          virtual void doSomething()=0;
    };
    
    //具体构件
    class ConcreteComponentA:public Component{
    public:
         ConcreteComponentA(){}
         ~ConcreteComponentA(){}
         
         void doSomething(){
              cout<<"功能A"<<endl;  
        }
    };

    class ConcreteComponentB:public Component{
    public:
         ConcreteComponentB(){}
         ~ConcreteComponentB(){}
         
         void doSomething(){
              cout<<"功能B"<<endl;  
        }
    };

    //装饰者角色 class Decorator:public Component{
        public: 
    Decorator(Component
    * com){ _com=com; }
    ~Decorator(){ delete _com; }

    void doSomething(){
    _com->doSomething();
        }    
    };
    
    //具体装饰者角色
    class ConcreteDecorator:public Decorator{
    public:
         ConcreteDecorator(Component* com):Decorator(com){}
         ~ConcreteDecorator();
         
         void doSomething(){
                Decorator::doSomething();
                doAnotherthing();
         }
    private:
         void doAnotherthing(){
              cout<<"功能C"<<endl;
        }
    };

    采用这样的方式我们可以通过ConcreteDecorator的构造函数来确定传递某个具体的ConcreteComponent类.

    例如此例:

           ConcreteDecorator* pA=new ConcreteDecorator(new ConcreteComponentA()) 或者

                                                                                new ConcreteComponentB();

      通过这种方式只要是Component型别的对象都可以提供修饰操作的类,这样就算我们新建了100个Component型别的类ConcreteComponent,也都可以由Decorator一个类搞定.而这也正是Decorator模式的关键所在.

                               

                                                                                                                                    

  • 相关阅读:
    VB6 获取和设置默认打印机
    VB操作EXCEL文件大全
    VB常用字符串操作函数
    VB数组的清除
    清理系统内存
    转:清理系统垃圾的BAT代码
    对Kalman(卡尔曼)滤波器的理解
    Kernel Memory Layout on ARM Linux
    linux kernel内存映射实例分析
    基于ARM的模拟器
  • 原文地址:https://www.cnblogs.com/sixue/p/4149634.html
Copyright © 2011-2022 走看看