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

2014-11-24 12:03:55 · 作者: · 浏览: 2

一. 举例

我之前做过一个文件系统就叫 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..."< }
};

//装饰抽象类
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...."< }
};

//杀毒装饰类
class KillVirDecorator:public Decorator
{
public:
KillVirDecorator(FileSys* fileSys):Decorator(fileSys)
{
}

~KillVirDecorator()
{
}

void Operation()
{
_fileSys->Operation();

this->AddedKillVirBehavior();
}

void AddedKillVirBehavior()
{
cout<<"Added Kill Virus Behavior...."< }
};

//加密装饰类
class EncryptDecorator:public Decorator
{
public:
EncryptDecorator(FileSys* fileSys):Decorator(fileSys)
{
}

~EncryptDecorator()
{
}

void Operation()
{
_fileSys->Operation();

this->AddedEncrypeBehavior();
}

void AddedEncrypeBehavior()
{
cout<<"Added Encrypt Behavior...."< }
};

//////////////////////////////////////////////////////////////////////////
//测试
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.2cto.com
class MyFileSys:public FileSys
{
public:
MyFileSys()
{
}

~MyFileSys()
{
}

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

//装饰抽象类
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(); //首先运行以前的功能