Decorator-装饰-对象

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模式转发给一个独立的对象全权处理。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值