c++设计模式概述之装饰器

类写的不够规范,目的是为了缩短篇幅,实际中请不要这样做。 

 

1、概述

  想象一下修房子。当施工队把房子框架结构做好了,墙刷上了水泥, 这时,工队暂时没有钱,装修只能暂停了。 过了一段时间,工队筹集了资金,继续装修,最后交给用户。

  这个过程中, 就和 装饰器模式 很接近。 工队前期,做好了房屋结构框架,刷上了水泥, 好比现有的类,这时,需要对其进行扩展,就好比房屋的后期装修。装饰器模式就和这个道理是一样的。

  下面示例

 

2、房屋基类

// 房子基类
class house
{
public:
    virtual void get_info() = 0;
};

3、毛坯房刷上了水泥

// 拿到毛坯房,都是水泥墙,还没有装修
class house_my : public house
{    
public:
    // 毛坯房拿到了,输出基本信息
    void get_info()
    {
        cout << "毛坯房拿到了,都是水泥墙,还没有装修\n";
    }
};

4、工队筹集了资金,准备i装修,装修时建立在现有的水泥房之上

// 定义一个抽象的装修类,目的是为了保留现有对象的接口和属性
class house_decorator : public house
{
public:

    // 初始化原有对象
    void init(house *pinstance)
    {
        if (nullptr != pinstance)
            _phouse = pinstance;
    }

    // 为了输出原始对象的接口
    void get_info()
    {
        if (_phouse)
            _phouse->get_info();
    }

private:
    // 保存原始接口
    house    *_phouse = nullptr;
};

5、装修计划已经做好,下面开始装修

// 现在开始装修了,当然是基于原始的毛坯房
class house_decorator_my : public house_decorator
{
public:
    // 装修是建立在毛坯房的基础上
    void init2(house *pinstance)
    {
        if (nullptr != pinstance)
            init(pinstance);
    }

    // 厨房装修好了
    void get_kitchen_info()
    {
        cout << "\n 厨房装修好了\n";
    }

    void get_drawing_room_info()
    {
        cout << "\n 客厅装修好了 \n";
    }
};

 

6、房屋装修好了,来看看结果:(装饰器类调用)

// 尝试调用房子装修结果
void call_house_mode()
{
    // 1、先拿到毛坯房
    std::unique_ptr<house> phouse(new(std::nothrow) house_my);
    if (!phouse)
    {
        cout << "\n 毛坯房 还没有修好\n";
        return;
    }

    // 2、 输出毛坯房信息
    cout << "\n 毛坯房结果:";
    phouse->get_info();

    // 3、 创建装修工具
    std::unique_ptr<house_decorator_my> phouse_decorator_my(new(std::nothrow) house_decorator_my);

    if (!phouse_decorator_my)
    {
        cout << "\n 房子还没装修好,再等等 \n";
        return;
    }

    cout << "\n \n\n\n 毛坯房装修完了,结果:\n";

    // 初始化毛坯房
    phouse_decorator_my->init(phouse.get());

    // 看看装修结果
    phouse_decorator_my->get_info();
    phouse_decorator_my->get_drawing_room_info();
    phouse_decorator_my->get_kitchen_info();
}

 

7、输出

 

posted @ 2020-08-12 17:18  mohist  阅读(607)  评论(0编辑  收藏  举报