一、場景及UML圖
場景:又稱修飾模式,就是對類起修飾作用。如類“人”,用類“衣服”來修飾。
關鍵詞:Decorator()函數/setComponent()函數。
二、概念
裝飾模式:動态地給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。
三、說明
角色:
(1)Component是定義一個對象,可以給這些對象動态地添加職責。
(2)ConcreteComponent是定義了一個具體的對象,也可以給這個對象增加一些職責。
(3)Decorator,裝飾抽象類,繼承了Component,從外類來擴充Component類的功能,但是對于Component來說,是無需知道Decorator的存在的。
(4)至于ConcreteDecorator就是具體的裝飾對象,起到給Component添加職責的作用。
什麼時候用:
(1)需要在内部組裝完成再顯示出來的情況。
(2)類似于建造者模式,但是建造者模式的要求見到的過程必須是穩定的,而裝飾模式的建造過程是不穩定的。
(3)我們需要把所需的功能按正确的順序串聯起來進行控制。
優點:
(1)把類的裝飾功能從類中搬移去除,這樣可以簡化原有的類。
(2)有效地把類的核心職責和裝飾功能區分開來,而且可以去除相關類中重複的裝飾邏輯。
和建造者模式的差別?
建造者模式要求建造的過程必須是穩定的,而裝飾模式的建造過程是不穩定的,可以有各種各樣的組合方式。
四、實作
(1)Conponent即ConcreteComponent類:此處為Person類
此處沒有單獨設立被裝飾對象類
#ifndef PERSON_H
#define PERSON_H
#include <string>
#include <iostream>
//ConcreteComponent即Component
class Person
{
private:
std::string name;
public:
Person(){};
Person(std::string name)
{
this->name=name;
}
virtual void Show()
{
std::cout<<"裝飾的"<<name<<std::endl;
}
};
#endif
(2)Decorator及ConcreteDecorator:此處為Finery及其子類
#ifndef FINERY_H
#define FINERY_H
#include <iostream>
#include "Person.h"
//Decorator類
class Finery:public Person
{
protected:
Person* component;
public:
void Decorator(Person* component)
{
this->component=component;
}
void Show()
{
if(component!=NULL)
component->Show();
}
};
//下面是一系列ConcreteDecorator類
class TShirts:public Finery
{
public:
void Show()
{
std::cout<<"大T恤 ";
Finery::Show();
}
};
//ConcreteDecorator類
class BigTrouser:public Finery
{
public:
void Show()
{
std::cout<<"垮褲 ";
Finery::Show();
}
};
//ConcreteDecorator類
class Sneakers:public Finery
{
public:
void Show()
{
std::cout<<"破球鞋 ";
Finery::Show();
}
};
//ConcreteDecorator類
class Suit:public Finery
{
public:
void Show()
{
std::cout<<"西裝 ";
Finery::Show();
}
};
//ConcreteDecorator類
class Tie:public Finery
{
public:
void Show()
{
std::cout<<"領帶 ";
Finery::Show();
}
};
//ConcreteDecorator類
class LeatherShoes:public Finery
{
public:
void Show()
{
std::cout<<"皮鞋 ";
Finery::Show();
}
};
#endif
(3)用戶端:main
#include "Finery.h"
#include <string>
#include <iostream>
//用戶端
void main()
{
Person* xc=NULL;
xc=new Person("小菜");
std::cout<<"第一種裝扮:"<<std::endl;
Sneakers* pqx=NULL;
pqx=new Sneakers();
BigTrouser* kk=NULL;
kk=new BigTrouser();
TShirts* dtx=NULL;
dtx=new TShirts();
pqx->Decorator(xc);
kk->Decorator(pqx);
dtx->Decorator(kk);
dtx->Show();
std::cout<<"第二種裝扮:"<<std::endl;
LeatherShoes* px=NULL;
px=new LeatherShoes();
Tie* ld=NULL;
ld=new Tie();
Suit* xz=NULL;
xz=new Suit();
px->Decorator(xc);
ld->Decorator(px);
xz->Decorator(ld);
xz->Show();
if(xc!=NULL)
{
delete xc;
xc=NULL;
}
if(pqx!=NULL)
{
delete pqx;
pqx=NULL;
}
if(kk!=NULL)
{
delete kk;
kk=NULL;
}
if(dtx!=NULL)
{
delete dtx;
dtx=NULL;
}
if(px!=NULL)
{
delete px;
px=NULL;
}
if(ld!=NULL)
{
delete ld;
ld=NULL;
}
if(xz!=NULL)
{
delete xz;
xz=NULL;
}
system("pause");
}
五、輸出