天天看點

C++設計模式 ==> 裝飾(者)模式

簡介

裝飾模式指的是在不必改變原類檔案和使用繼承的情況下,動态地擴充一個對象的功能。它是通過建立一個包裝對象,也就是裝飾來包裹真實的對象。裝飾模式使用對象嵌套的思想,實作對一個對象動态地進行選擇性的屬性賦予與去除,例如有一篇固定的文本,我們可以給它裝飾上“詞彙過濾”與“文本加密”兩個屬性,但同時也要注意裝飾順序:例如文本如果先進行加密操作就沒法進行詞彙過濾的操作了。

下面示範一個簡單的裝飾模式的例子:我們的家(House類)可以進行各種裝飾(DecorateTool類),例如添置家具(Furniture子類)與添置電器(ElectricApp子類)。

圖示

代碼實作

/////////////////////////////////
//
// @Author : PeterZheng
// @FileName : DecorateModeHeader.h
// @Date : 2018-08-09 17:23
//
/////////////////////////////////

#pragma

#ifndef DMINCLUDE 
#define

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <tchar.h>

#endif

using namespace std;

class House
{
public:
    House() {}
    ~House() {}
    virtual void Show()
    {
        wcout << _T("的房子") << endl;
    }
};

class DecorateTool :public House
{
public:
    DecorateTool(House *h) :hs(h), House() {}
    virtual void Show()
    {
        hs->Show();
    }
private:
    House * hs;
};

class Furniture : public DecorateTool
{
public:
    Furniture(House *h) :DecorateTool(h) {}
    virtual void Show()
    {
        wcout << _T("擺放了家具的");
        DecorateTool::Show();
    }
};

class ElectricApp : public DecorateTool
{
public:
    ElectricApp(House *h) :DecorateTool(h) {}
    virtual void Show()
    {
        wcout << _T("裝有電器的");
        DecorateTool::Show();
    }
};      
/////////////////////////////////
//
// @Author : PeterZheng
// @FileName : DMdemo.cpp
// @Date : 2018-08-09 17:23
//
/////////////////////////////////

#include "DecorateModeHeader.h"

using namespace std;

int _tmain(void)
{
    House *myHouse = new House();
    House *fHouse = new Furniture(myHouse);
    House *eapHouse = new ElectricApp(fHouse);
    wcout.imbue(std::locale("chs"));
    eapHouse->Show();
    system("pause");
    return 0;
}