当前位置:编程学习 > C/C++ >>

设计模式C++描述----10.装饰(Decorator)模式

一. 举例

我之前做过一个文件系统就叫 MyFileSys 吧,后来的话,客户想加入一些附加功能,比如压缩、加密、杀毒之类的操作,这些附加操作没有先后顺序,比如你可以先压缩再加密,也可以先杀毒再压缩,等等。

这些附加功能是可选的,有的客户要这些功能,有的不要,有的要其中的几种附加功能等等。怎么设计呢?

第一种方案:
直接修改这个独立的文件系统 MyFileSys,对于不同的客户实现不同的文件系统。

\
后来随着客户的增多,发现维护和修改的工作量越来越大。因为每增加一个客户就要重新生成一个类,然后把客户想要的附加功能加入,更加郁闷的是,只针对一个客户有时也是要修改很多次,客户今天要这些附加功能,明天又想加入另外一些功能,这样改来改去,维护工作量也是很大的。

第二种方案:

后来改用第二种方案,实现一个单独的附加功能类,保持原文件系统不变,这样在客户端就可以轻松的加入一些附加功能。

\

代码如下:


[cpp] //定义一个对象接口,可以给这些对象动态地添加职责  
class FileSys 

public: 
    virtual ~FileSys() 
    { 
    } 
 
    virtual void Operation() 
    { 
    } 
protected: 
    FileSys() 
    { 
    } 
}; 
 
//定义一个具体的对象  
class MyFileSys:public FileSys 

public: 
    MyFileSys() 
    { 
    } 
 
    ~MyFileSys() 
    { 
    } 
 
    void Operation() 
    { 
        cout<<"MyFileSys operation..."<<endl; 
    } 
}; 
 
//装饰抽象类  
class Decorator:public FileSys 

public: 
    Decorator(FileSys* fileSys) 
    { 
        this->_fileSys = fileSys; 
    } 
 
    virtual ~Decorator() 
    { 
        delete _fileSys; 
    } 
 
    void Operation() 
    { 
    } 
protected: 
    FileSys* _fileSys; 
}; 
 
//压缩装饰类  
class ZipDecorator:public Decorator 

public: 
    ZipDecorator(FileSys* fileSys):Decorator(fileSys) 
    { 
    } 
 
    ~ZipDecorator() 
    { 
    } 
     
    void Operation() 
    { 
        _fileSys->Operation(); //首先运行以前的功能  
         
        this->AddedZipBehavior(); //附加功能  
    } 
     
    void AddedZipBehavior() 
    { 
        cout<<"Added Zip Behavior...."<<endl; 
    } 
}; 
 
//杀毒装饰类  
class KillVirDecorator:public Decorator 

public: 
    KillVirDecorator(FileSys* fileSys):Decorator(fileSys) 
    { 
    } 
     
    ~KillVirDecorator() 
    { 
    } 
     
    void Operation() 
    { 
        _fileSys->Operation(); 
         
        this->AddedKillVirBehavior(); 
    } 
     
    void AddedKillVirBehavior() 
    { 
        cout<<"Added Kill Virus Behavior...."<<endl; 
    } 
}; 
 
//加密装饰类  
class EncryptDecorator:public Decorator 

public: 
    EncryptDecorator(FileSys* fileSys):Decorator(fileSys) 
    { 
    } 
     
    ~EncryptDecorator() 
    { 
    } 
     
    void Operation() 
    { 
        _fileSys->Operation(); 
         
        this->AddedEncrypeBehavior(); 
    } 
     
    void AddedEncrypeBehavior() 
    { 
        cout<<"Added Encrypt Behavior...."<<endl; 
    } 
}; 
 
//////////////////////////////////////////////////////////////////////////  
//测试  
int main() 

    FileSys* fileSys = new MyFileSys(); 
     
    Decorator* dec1 = new ZipDecorator(fileSys);  //在原文件系统上,加入压缩功能  
    Decorator* dec2 = new KillVirDecorator(dec1); //在之前的基础上,加入杀毒功能  
    Decorator* dec3 = new EncryptDecorator(dec2); //再加入加密功能  
 
    dec3->Operation(); 
 
    return 0; 

//定义一个对象接口,可以给这些对象动态地添加职责
class FileSys
{
public:
    virtual ~FileSys()
    {
    }

    virtual void Operation()
    {
    }
protected:
    FileSys()
    {
    }
};

//定义一个具体的对象 www.zzzyk.com
class MyFileSys:public FileSys
{
public:
    MyFileSys()
    {
    }

    ~MyFileSys()
    {
    }

    void Operation()
    {
        cout<<"MyFileSys operation..."<<endl;
    }
};

//装饰抽象类
class Decorator:public FileSys
{
public:
&nb

补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,