天天看點

大話設計模式(4)裝飾模式

一、場景及UML圖

場景:又稱修飾模式,就是對類起修飾作用。如類“人”,用類“衣服”來修飾。

大話設計模式(4)裝飾模式

關鍵詞: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");
}
           

五、輸出

大話設計模式(4)裝飾模式

繼續閱讀