装饰模式(Decorator)

意图
动态的给一个对象添加一些额外的职责。
Decorator模式添加功能比生成子类更为灵活。

类图

参与者
  • Component
    定义一个对象接口,可以给这些对象动态地添加职责
  • ConcreteComponent
    定义一个对象,可以个这个对象添加一些职责
  • Decorator
    维持一个指向Component对象的指针,并定义一个与Component的接口一致的接口
  • ConcreteDecorator
    向组件添加职责
代码
# include  <iostream >
# include  <string >
using  namespace std;
class Component
{
public :
     virtual  void Operation()  =  0;
};
class ConcreteComponent : public Component
{
public :
     void Operation()
    {
        cout << "具体对象的操作 ConcreteOp" <<endl;
    }
};
class Decorator : public Component
{
protected :
    Component  *pComp;
public :
     void SetComponent(Component  *pComp)
    {
         this - >pComp  = pComp;
    }
     void Operation()
    {
         if(pComp  != NULL)
        {
            pComp - >Operation();
        }    
    }
};

class ConcreteComponentA : public Decorator
{
private :
    string addState;  //添加的新状态
public :
    ConcreteComponentA(string state)
    {
          this - >addState  = state;
    }
     void Operation()
    {
        Decorator : :Operation(); //调用父类方法
        cout << "A 装饰类: " <<endl;
        cout << "添加了的新状态: " << this - >addState <<endl;
    }
};
class ConcreteComponentB : public Decorator
{
private :
    string addState;  //添加的新状态
     void AddedOperation()
    {
        cout << "添加了的新职责BFun" <<endl;
    }
public :
     void Operation()
    {
        Decorator : :Operation(); //调用父类方法
        cout << "B 装饰类:" <<endl;
        AddedOperation();
    }
};
int main()
{
     ConcreteComponent  *pConComp  =  new ConcreteComponent();
     ConcreteComponentA  *pConCompA  =  new ConcreteComponentA( "Astate");
     ConcreteComponentB  *pConCompB  =  new ConcreteComponentB();

     pConCompA - >SetComponent(pConComp);
     pConCompB - >SetComponent(pConCompA);

     pConCompB - >Operation();
}



Head First设计模式
  1. 运行时扩展,远比编译时期的继承威力大
  2. 装饰模式可以使你在不修改任何底层代码的情况下,给你的(或别人的)对象赋予新的职责

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值