C++设计模式 ==> 装饰(者)模式

时间:2023-03-09 02:45:41
C++设计模式 ==> 装饰(者)模式

简介

装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。装饰模式使用对象嵌套的思想,实现对一个对象动态地进行选择性的属性赋予与去除,例如有一篇固定的文本,我们可以给它装饰上“词汇过滤”与“文本加密”两个属性,但同时也要注意装饰顺序:例如文本如果先进行加密操作就没法进行词汇过滤的操作了。

下面演示一个简单的装饰模式的例子:我们的家(House类)可以进行各种装饰(DecorateTool类),例如添置家具(Furniture子类)添置电器(ElectricApp子类)

图示

C++设计模式 ==> 装饰(者)模式

代码实现

/////////////////////////////////
//
// @Author : PeterZheng
// @FileName : DecorateModeHeader.h
// @Date : 2018-08-09 17:23
//
///////////////////////////////// #pragma once #ifndef DMINCLUDE
#define DMINCLUDE #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;
}