1. Decorator-装饰-对象
1.1 特点及用处
² 给类对象而不是类定义增加功能。这意味着同一个类的不同对象的特性行为将不一样,看你怎么构造你的对象。
² 当希望对某类对象进行一些处理,加入些特性(处理成员变量)时,你可以选择:
l 直接在这个类添加方法处理
缺点:导致类膨胀,而且功能可能跟类不太相干;不利于重用这特性。
l 继承这个类,增加些方法
缺点:当特性很多时,特性的组合导致多重继承的出现;类结构复杂性增加;同样不利于重用,因为别的类也可能需要这一特性。
l 使用Decorator模式设计实现
允许你为类对象添加很多特性,而不改变原有类的结构。一点一点 的添加特性,而不是将所有特性放在一起实现。
1.2 实现
² 定义一个公共接口IDecorator, 包含了所有需要增加的特性。
Class IDecorator
{
Public:
Virtual void Encoding(); //特性1
Virtual void Encrypt(); //特性 2
}
² 业务类
Class Business: public IDecorator
{
Public:
//IDecorator接口方法
//业务方法
Private:
//变量
}
² 装饰类
Class Decorator: public IDecorator
{
Public:
Decorator(IDecorator* pIDecorator); //构造函数
Void Encoding()
{
pIDecorator->Encoding(); //调用,主要用于转发同一特性的多个版本
}
Private:
IDecorator* pIDecorator;
}
Class Decorator1: public Decorator
{
Decorator1(IDecorator* pIDecorator, 其他参数); //构造函数
Void Encoding()
{
//对pIDecorator进行一些处理,特性1的一个版本
Decorator::Encoding(); //调用
}
}
Class Decorator2: public Decorator
{
Decorator2(IDecorator* pIDecorator, 其他参数); //构造函数
Void Encoding()
{
//对pIDecorator进行一些处理,特性1的另外一个版本
Decorator::Encoding(); //调用
}
}
² 应用
Main()
{
IDecorator* pIDecorator=new Business;
Func(pIDecorator); //没有装饰器
//一种用法
Func(new Decorator1 //装饰1
(new Decorator2(pIDecorator) ) //装饰2
)
//另一种用法
pIDecorator=(new Decorator1 //装饰1
(new Decorator2(pIDecorator) ) //装饰2
)
pIDecorator->Encoding();//或者在Func体内调用。
展开以后可以分为几步:
1) Decorator1->Encoding();//特性1的第一个版本
2) 由于Decorator1保存有Decorator2的指针,继续执行Decorator2->Encoding();
3) 最后执行Business->Encoding();
4) 特性1的第一个版本和特性1的第二个版本执行顺序由Encoding函数实现决定。
5) 如此可以嵌套特性的多个版本,你也可以理解为多个特性,比如说先加密再编码,只不过在一个同名方法里实现。
}
1.3 优缺点
² 动态的为对象而不是类添加特性
² 独立的装饰类,利用管理
² 可使主功能类与装饰类独立,互相不暴露。
u 存在若干小装饰对象,由于对象行为有互相转发,排错相对困难。
u 当主功能类很复杂时,这个模式代价过高,因为这个模式的一个特点是转发特性给相应的特性类处理,通过虚拟函数实现。这时可考虑用Strategy模式转发给一个独立的对象全权处理。