裝飾模式:動態地給一個對象添加一些額外的職責。就增加功能來說,裝飾模式相比生成子類更爲靈活。有時我們希望給某個對象而不是整個類添加一些功能。比如有一個手機,允許你爲手機添加特性,比如增加掛件、屏幕貼膜等。一種靈活的設計方式是,將手機嵌入到另一對象中,由這個對象完成特性的添加,我們稱這個嵌入的對象爲裝飾。這個裝飾與它所裝飾的組件接口一致,因此它對使用該組件的客戶透明。
***********************************************main.cpp**************************************************
#include "Person.h"
#include "costume.h"
#include "BigTrouser.h"
#include "Tshirt.h"
#include "Decorate.h"
#include <string>
int main()
{
string name ="DPT";
Person *person = new Decorate(name);
Person *a = new Tshirt(person);
Person *b = new BigTrouser(a);
b->ShowDecorate();//輸出DPT的裝扮:Tshirt BigTrouser
getchar();
return 0;
}
/***********************************************Person.h**************************************************/
//抽象基類
#include <iostream>
using namespace std;
#pragma once;
class Person
{
public:
Person(){};
virtual void ShowDecorate() = 0;
};
/***********************************************Decorate.h**************************************************/
//真正要裝飾的類
#include "Person.h"
#include <string>
class Decorate: public Person
{
public:
string m_name;
public:
Decorate(string name)
{
</span>m_name = name;
}
void ShowDecorate()
{
cout<<m_name<<"的裝飾:";
}
};
/***********************************************Costume.h**************************************************/
#include "Person.h"
#pragma once;
class Costume:public Person
{
Person *m_person;
public:
Costume(){}
Costume(Person *person)
{
m_person = person;
}
void ShowDecorate()
{
m_person->ShowDecorate();
}
};
/***********************************************BigTrouser.h**************************************************/
#include "costume.h"
class BigTrouser:public Costume
{
Person * m_person;
public:
BigTrouser(Person * person)
{
m_person = person;
}
void ShowDecorate()
{
m_person->ShowDecorate();
AddDecorate();
}
void AddDecorate()
{
cout<<"BigTrouser ";
}
};
/***********************************************Tshirt.h**************************************************/
#include "costume.h"
class Tshirt:public Costume
{
Person * m_person;
public:
Tshirt(Person *person)
{
m_person = person;
}
void ShowDecorate()
{
m_person->ShowDecorate();
AddDecorate();
}
void AddDecorate()
{
cout<<"T-shirt ";
}
};