1. 程式人生 > 實用技巧 >c++設計模式概述之裝飾器

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 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 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、輸出