程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++設計模式之建造者模式(二)

C++設計模式之建造者模式(二)

編輯:C++入門知識

C++設計模式之建造者模式(二)


3、省略指揮者Director的建造者模式

指揮者類Director在建造者模式中扮演非常重要的作用,簡單的Director類用於指導具體建造者如何構建產品,它按一定次序調用Builder的buildPartX()方法,控制調用的先後次序,並向客戶端返回一個完整的產品對象。Direcotr針對抽象的建造者進行編程,如果需要不同的建造者,只需把建造者傳入指揮者類,無需修改之前的代碼。

在有些情況下,為了簡化系統結構,可以省略指揮者Director,指揮者不再指導產品的創建過程。而是在Builder中提供逐步構建復雜產品對象的construct()方法。

暴風影音播放器是具體的產品,實現代碼和上一篇博客一樣,這裡就不再呈現。有變化的是建造者類,播放模式.h頭文件實現代碼如下:

#ifndef _PLAY_PATTERN_H_
#define _PLAY_PATTERN_H_
#include 
#include 
#include "Player.h"
using namespace std;

//抽象播放模式
class PlayPattern
{
protected:
	//具體產品(播放器)
	Player * m_pPlayer;
public:
	PlayPattern()
	{
		m_pPlayer = new Player();
	}

	~PlayPattern()
	{
		if( NULL != m_pPlayer )
		{
			delete m_pPlayer;

			m_pPlayer = NULL;
		}
	}
	
	//制造播放窗口
	virtual void BuildWindow() = 0;

	//制造播放菜單
	virtual void BuildMenu() = 0;

	//制造播放列表
	virtual void BuildPlayList() = 0;

	//制造播放進度條
	virtual void BuildControlBar() = 0;

	//制造收藏列表
	virtual void BuildCollectList() = 0;

	//開始建造,封裝建造過程
	Player * StartConstruct()
	{
		BuildWindow();
		BuildMenu();
		BuildPlayList();
		BuildControlBar();
		BuildCollectList();
		
		return m_pPlayer;
	}
};


//完整播放模式
class FullPattern : public PlayPattern
{
public:
	void BuildWindow();
	void BuildMenu();
	void BuildPlayList();
	void BuildControlBar();
	void BuildCollectList();
};


//精簡播放模式
class SimplePattern : public PlayPattern
{
public:
	void BuildWindow();
	void BuildMenu();
	void BuildPlayList();
	void BuildControlBar();
	void BuildCollectList();
};


//記憶播放模式
class MemoryPattern : public PlayPattern
{
public:
	void BuildWindow();
	void BuildMenu();
	void BuildPlayList();
	void BuildControlBar();
	void BuildCollectList();
};

#endif
指導者類不再指導暴風影音產品對象的創建過程,而是由抽象播放器模式StartConstruct方法來封裝播放器產品的創建過程。
播放模式Cpp文件代碼如下:

#include "PlayPattern.h"

//制造播放窗口
void FullPattern::BuildWindow()
{
	m_pPlayer->SetWindow("主界面窗口");
}

//制造播放菜單
void FullPattern::BuildMenu()
{
	m_pPlayer->SetMenu("主菜單");
}

//制造播放列表
void FullPattern::BuildPlayList()
{
	m_pPlayer->SetPlayList("播放列表");
}

//制造播放進度條
void FullPattern::BuildControlBar()
{
	m_pPlayer->SetControlBar("進度條");
}

//制造收藏列表,完整播放模式沒有收藏列表,內容設為空
void FullPattern::BuildCollectList()
{
	m_pPlayer->SetCollectList(" ");
}

////////////////精簡模式///////////////////////////////

void SimplePattern::BuildWindow()
{
	m_pPlayer->SetWindow("主界面窗口");
}

void SimplePattern::BuildMenu()
{
	m_pPlayer->SetMenu(" ");
}

void SimplePattern::BuildPlayList()
{
	m_pPlayer->SetPlayList(" ");
}

void SimplePattern::BuildControlBar()
{
	m_pPlayer->SetControlBar("進度條");
}

void SimplePattern::BuildCollectList()
{
	m_pPlayer->SetCollectList(" ");
}

/////////////////記憶模式////////////////////////////////

void MemoryPattern::BuildWindow()
{
	m_pPlayer->SetWindow("主界面窗口");
}

void MemoryPattern::BuildMenu()
{
	m_pPlayer->SetMenu(" ");
}

void MemoryPattern::BuildPlayList()
{
	m_pPlayer->SetPlayList(" ");
}

void MemoryPattern::BuildControlBar()
{
	m_pPlayer->SetControlBar("進度條");
}

void MemoryPattern::BuildCollectList()
{
	m_pPlayer->SetCollectList("收藏列表");
}
完整播放模式下並不需要建造收藏列表部件,因此把收藏列表的內容設為空,其它情況類型,把不需要建造的部件內容設為空。測試程序實現代碼如下:

#include 
#include "PlayPattern.h"
#include "Player.h"

using namespace std;

int main()
{
	Player * pPlayer = NULL;

	/***********************完整播放模式************************/
	PlayPattern * pFullPattern = new FullPattern();
	cout << "完整播放模式:" << endl;
	pPlayer = pFullPattern->StartConstruct();
	pPlayer->Display();

 	/***********************精簡播放模式************************/
	SimplePattern * pSimplePattern = new SimplePattern();
	cout << "精簡播放模式:" << endl;
	pPlayer = pSimplePattern->StartConstruct();
	pPlayer->Display();
 
 	/***********************記憶播放模式************************/
	MemoryPattern * pMemoryPattern = new MemoryPattern();
	cout << "記憶播放模式:" << endl;
	pPlayer = pMemoryPattern->StartConstruct();
	pPlayer->Display();

	/***********************銷毀操作****************************/
	cout << endl;
	delete pFullPattern;
	pFullPattern = NULL;

	delete pSimplePattern;
	pSimplePattern = NULL;

	delete pMemoryPattern;
	pMemoryPattern = NULL;

	return 0;
}
編譯並執行,結果如下:


此時,StartConstruct()方法定義了其他buildPartX()方法調用的次序,為其他方法的執行提供了一個流程模板,這與我們在後面要學習的模板方法模式非常類似。對Director類的省略方式都不影響系統的靈活性和可擴展性,同時還簡化了系統結構,但加重了抽象建造者類的職責,如果StartConstruct()方法較為復雜,待構建產品的組成部分較多,建議還是將StartConstruct()方法單獨封裝在Director中,這樣做更符合“單一職責原則”


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved