編程學習之裝飾者模式

裝飾模式:實現動態的給一個對象添加一些額外的職責。優越性主要體現在減少對了主類的更改,遵守了開放封閉原則。將類的核心職責和裝飾功能分離了開來。

在這個設計模式之中,主要分爲這幾個模塊:具體的被裝飾對象,裝飾功能的接口,具體的裝飾功能。

首先將被裝飾對象的接口全部提取出來,分別讓含有具體裝飾功能的類和被裝飾對象的類繼承於該類,這樣具體的裝飾功能類便具有了被裝飾對象的方法接口。

每個裝飾功能類之中含有具體對象類的指針。(c#中是引用,但引用實質上仍與指針有類似意義)

當需要對現有的對象類的部分功能進行更改的時候,特別是這種更改僅僅是暫時的動態的改變的時候,就完全可以通過將具體對象類的地址值賦值給裝飾功能類的對象,而具體的裝飾功能類則對需要改變的地方進行重寫,無改變的地方則直接調用原來的方法即可。而且不會改變原來的代碼。

#pragma once
#include<iostream>
using namespace std;
class Monkey
{
public:
	Monkey();
	~Monkey();
	virtual void Show()=0;
};
#include "Monkey.h"

Monkey::Monkey(){}
Monkey::~Monkey(){}

這是我所定義的接口類,其中只有一些虛的方法。

#pragma once
#include "Monkey.h"
class People :
	public Monkey
{
public:
	People();
	virtual ~People();
	virtual void Show();
};

#include "People.h"

People::People(){}
People::~People(){}

void People::Show()
{
	cout << "高智商的人" << endl;
}

這是將要具體實例化的對象的人的類,在這個人的類之中已經具備了一些具體的功能,現在如果我們需要對這些功能做出一些改變,怎麼辦呢?

看下面:

#pragma once
#include "Monkey.h"
class ConcreteDecorator :
	public Monkey
{
public:
	ConcreteDecorator();
	virtual ~ConcreteDecorator();
	Monkey* obj;
	virtual void SetComponent(Monkey* obj);
	virtual void Show();
};
#include "ConcreteDecorator.h"

ConcreteDecorator::ConcreteDecorator(){}
ConcreteDecorator::~ConcreteDecorator(){}

void ConcreteDecorator::SetComponent(Monkey* obj) 
{
	this->obj = obj;
}

void ConcreteDecorator::Show()
{
	this->obj->Show();
}
這個是我所創建的一個所有的具體功能的類的基類,通過這個類,我們便可以派生出其他很多具體的功能類,注意在這個類之中擁有一個關於具體對象的指針,通過這個指針我們便可以獲取到實例化的具體的對象

再看具體化的裝飾功能類:

#pragma once
#include "ConcreteDecorator.h"
class BehaviorCreat :
	public ConcreteDecorator
{
public:
	BehaviorCreat();
	virtual ~BehaviorCreat();
	virtual void Show();
};

#include "BehaviorCreat.h"

BehaviorCreat::BehaviorCreat(){}
BehaviorCreat::~BehaviorCreat(){}

void BehaviorCreat::Show()
{
	cout << "會創造性行爲的";
	ConcreteDecorator::Show();
}
這是我所創建的創造性性行爲的修飾類,我們可以看到在這個類中我們對對象類之中的行爲進行了重寫,同時保留了部分原來的方法,且對原類沒有任何更改,也沒有重複代碼的累贅,我們直接使用被修飾的對象就可以完成功能的擴展和改變。

主邏輯代碼如下:

// 裝飾模式樣例.cpp : 定義控制檯應用程序的入口點。
//

#include "stdafx.h"
#include"People.h"
#include"Orangutans.h"
#include"BehaviorCreat.h"

int main()
{
	People* man = new People();
	Orangutans* xingxing = new Orangutans();
	BehaviorCreat *bh_creat = new BehaviorCreat();
	bh_creat->SetComponent(xingxing);
	bh_creat->Show();
	bh_creat->SetComponent(man);
	bh_creat->Show();
	delete(man);
	delete(xingxing);
	delete(bh_creat);
	system("pause");
    return 0;
}

以上代碼是我所寫的一個具體的設計模式樣例的代碼的一部分,後面我會將整個工程代碼發出來,提供給大家:

http://pan.baidu.com/s/1i4DsURr

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章