背景:当我们只是给某个对象而不是整个类添加某个具体的功能时。 可以使用装饰器,让装饰器去完成对象所需要添加的某种功能。如果在原有类基础上去继承产生新的类,在新的类中添加这个新功能,这样做会造成代码大量冗余
目标:尽量使用组合,不要使用继承;尽量在编译时复用,运行时多态。
实例:
/*
当我们只是给某个对象添加某个功能,而不是整个类添加功能时,
可以使用装饰器,让装饰器去完成对象所需要的某种功能。
而不是在原有类基础上去继承产生新的类,在新的类中添加这个新功能,如果这样做会产生太多代码类似的类,造成冗余。
目的:尽量使用组合,不要使用继承;尽量在编译时复用,运行时多态。
*/
#include <iostream>
using namespace std;
class Stream{
public:
virtual void Fun() = 0;
virtual ~Stream(){}
};
class FileStream:public Stream{
public:
virtual void Fun(){
cout << "FileStream功能 " << endl;
}
};
// 装饰器类 以后遇到这种既继承又有组合同一个类时,很可能就是使用了装饰器模式
class Decorator:public Stream{
protected:
Stream* stream;
public:
Decorator(Stream* stream):stream(stream){}
};
// 具体装饰器为对象实现功能1
class CopStream:public Decorator{
public:
CopStream(Stream* stream):Decorator(stream){}
virtual void Fun(){
// 添加不同功能
cout << "功能1" << endl;
stream->Fun();
}
};
// 具体装饰器为对象实现功能2
class BuffStream:public Decorator{
public:
BuffStream(Stream* stream):Decorator(stream){}
virtual void Fun(){
// 添加不同功能
cout << "功能2" << endl;
stream->Fun();
}
};
int main(void)
{
FileStream* s1 = new FileStream();
s1->Fun();
cout << endl;
// 为s1添加功能1
CopStream* s2 = new CopStream(s1);
s2->Fun();
cout << endl;
// 为s1添加功能2
BuffStream* s3 = new BuffStream(s1);
s3->Fun();
cout << endl;
// 在为s1添加功能1的基础上,再添加功能2
BuffStream* s4 = new BuffStream(s2);
s4->Fun();
return 0;
}
结果如下