装饰模式(decorator)c++版本

此为大话设计模式decorator的c++版本

/*
 * decorator.cpp
 *
 *  Created on: Jul 19, 2017
 *      Author: clh01s@163.com
 *      装饰模式
 */

#include <iostream>
#include <string>

using namespace std;

class Person
{
public:
    Person(){};
    Person(string name)
    {
        _name = name;
    }
    virtual void show()
    {
        cout<<"装扮的"<<_name<<endl;
    }
    virtual ~Person(){}
private:
string _name;
};

class Finery:public Person
{
public:
    void Decorate(Person *component)
    {
        _component = component;
    }
    void show() override
    {
        if(NULL != _component)
        {
            _component->show();
        }
    }
protected:
    Person *_component;
};

class TShirts:public Finery
{
public:
    void show() override
    {
        string ts = "大T恤";
        cout<<ts<<endl;
        //调用基类的show函数
        Finery::show();
    }
};


class BigTrouser:public Finery
{
public:
    void show() override
    {
        string bt = "垮裤";
        cout<<bt<<endl;
        Finery::show();
    }
};

class Shoes:public Finery
{
public:
    void show() override
    {
        string s = "板鞋";
        cout<<s<<endl;
        Finery::show();
    }
};

int main()
{
    Person *tony = new Person("tony");
    cout<<"装扮一:"<<endl;
    TShirts *t = new TShirts();
    BigTrouser *b = new BigTrouser();
    Shoes *s =new Shoes();

    /*所有的装饰都是在前一个装饰的基础上进行叠加
    *下一个调用都将前一个对象当做参数传入至Decorate函数中
    */
    t->Decorate(tony);
    b->Decorate(t);
    s->Decorate(b);
    s->show();

    return 0;
}

运行结果:
装扮一:
板鞋
垮裤
大T恤
装扮的tony

装饰模式优点:(摘抄于《设计模式》)
1.比静态集成更灵活 与对象的静态集成相比,decorator模式提供了更加灵活的向对象添加职责的方式.可以用添加和分离的方法,用装饰在运行时刻增加和删除职责.相比之下,继承机制要求为每个添加的职责创建一个新的子类.这回增加系统的复杂度.
2.避免在层次结构高层的类有太多的特征 decorator提供了一宗即用即付的方法来添加职责.它并不试图在一个复杂的可定制的类中支持所有可预见的的特征,相反你可以定义一个简单的类并且用decotator给它组件给它添加功能.可以从简单的部件组合出复杂的功能.这样,应用程序不必为不需要的特征付出代价.
缺点:
1.decorator与它的compoent不一样 decorator是一个透明的包装.如果我们从对象标识的观点出发,一个被装饰的组件与这个组件是有差别的,因此使用装饰时不应该依赖对象标识.
2.有许多小对象 采用decorator模式进行系统设计往往会产生许多看上去类似的小对象,这些对象仅仅在他们互相链接的方式上有所不同,而不是他们的类或是他们的属性值有所不同.尽管对于那些了解这些系统的人来说,很容易对它们进行定制,但是很难学习这些系统,排错也很困难.

转载请注明源地址:http://blog.csdn.net/clh01s/article/details/75460478

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值