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