【无标题】


装饰模式(Decorator)和Component不一样。
Decorator是一个透明的包装。如果我们从对象标识的观点出发,一个被装饰了的组件与这个组件是有差别的,因此,使用装饰时不应该依赖对象标识。
注意:

       1、接口的一致性。装饰对象的接口必须与它所装饰的Component的接口是一致的。

       2、省略抽象的Docorator类。当你仅需要添加一个职责的时,没有必要定义抽象Decorator类。你常常需要处理显存的类层次结构而不是设计一个新系统,这时你可以把Decorator向Component转发请求的职责合并到ConcreteDecorator中。

       3、保持Component类的简单性。为了保证接口的一致性,组件和装饰必须有一个共同的Component父类。因此保持这个类的简单些是很重要的。
       
       
========================================================================================
222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
222222222222222222222222222222222222222222222222222222222222222222222222222222222222222

Decorator与component不一样。
Decorator是一个透明的包装。
注意:
1,接口的一致性。装饰对象的接口必须与它所装饰的Component的接口是一致的。
2,省略抽象的Docorator类。当你仅需要添加一个职责的时候,没有必要定义抽象Decorator类。
3,保持Component类的简单性。为了保证接口的一致性,组件和装饰必须有一个共同的Component父类。

============================================================

Decorator模式比生成子类模式更为灵活。

=========================================================
class absTable
{
public:
virtual void putTable() = 0;
};
class BaseTable : public absTable
{
public:
    virtual void putTable()
    {
    print("姓名");
    }
}
class Decorator : public absTable
{
    public:
    virtual void putTable()
    {
        mpAbsTable->putTable();
    }
    private"
        absTable* mpAbsTable;
}
class EnglishDcrt : public Decorator
{
    public:
    EnglishDcrt(absTable* pTb):Decorator(pTb){}
    virtual void putTable()
    {
        print("英语等级")
        Decorator::putTable();
    }

}

5555555555555555555555555555555555555555555555555555555555555555555555555
6666666666666666666666666666666666666666666666666666666666666666666666666
7777777777777777777777777777777777777777777777777777777777777777777777777
8888888888888888888888888888888888888888888888888888888888888888888888888
继承方式
关联方式
即将一个类对象嵌入另一个对象中,由另一个对象来决定是否调用嵌入对象的行为以便扩展自己的行为,我们称这个嵌入的对象为装饰器(Decorator)
装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展
装饰模式(Decorator Pattern) :动态地给一个对象增加一些额外的职责(Responsibility),就增加对象功能来说,装饰模式比生成子类实现更为灵活。其别名也可以称为包装(Wrapper),与适配器模式的别名相同,但它们适用于不同的场合。根据翻译的不同,装饰模式也有人称之为“油漆工模式”,它是一种对象结构型模式


Component定义一个对象接口,可以给这些对象动态的添加职责
Decorator维持一个指向

999999999999999999999999999999999999999999999999999999999999

888888888888888888888888888888888888888888888888888888888888

7777777777777777777777777777777777777777777777777777777777777

6666666666666666666666666666666666666666666666666666666666666

#include <iostream>
using namespace std;

class Component
{
public:
    virtual void Operation() = 0;
};

class ConcreteComponent : public Component
{
public:
    void Operation()
    {
        cout << "I am no decoratored ConcreteComponent" << endl;
    }
};

class Decorator : public Component
{
public:
    Decorator(Component *pComponent) : m_pComponentObj(pComponent) {}
    void Operation()
    {
        if (m_pComponentObj != nullptr)
        {
            m_pComponentObj->Operation();//采用多态,运行时所指的动态类型调用对用的版本
        }
    }
protected:
    Component *m_pComponentObj;
};

class ConcreteDecoratorA : public Decorator
{
public:
    ConcreteDecoratorA(Component *pDecorator) : Decorator(pDecorator){}
    void Operation()
    {
        Decorator::Operation();
        AddedBehavior();    
    }
    void  AddedBehavior()
    {
        cout << "This is added behavior A." << endl;
    }
};

class ConcreteDecoratorB : public Decorator
{
public:
    ConcreteDecoratorB(Component *pDecorator) : Decorator(pDecorator){}
    void Operation()
    {    
        Decorator::Operation();
        AddedBehavior();
    }
    void  AddedBehavior()
    {
        cout << "This is added behavior B." << endl;
    }
};
int main()
{
    Component *pComponentObj = new ConcreteComponent();
    Component *pDecoratorAOjb = new ConcreteDecoratorA(pComponentObj);
    pDecoratorAOjb->Operation();
    cout << "=============================================" << endl;

    Component *pDecoratorBOjb = new ConcreteDecoratorB(pComponentObj);
    pDecoratorBOjb->Operation();
    cout << "=============================================" << endl;

    Component *pDecoratorBAOjb = new ConcreteDecoratorB(pDecoratorAOjb);
    pDecoratorBAOjb->Operation();
    cout << "=============================================" << endl;

    delete pDecoratorBAOjb;
    pDecoratorBAOjb = nullptr;

    delete pDecoratorBOjb;
    pDecoratorBOjb = nullptr;

    delete pDecoratorAOjb;
    pDecoratorAOjb = nullptr;

    delete pComponentObj;
    pComponentObj = nullptr;

    system("pause");
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值