3、省略指揮者Director的建造者模式
指揮者類Director在建造者模式中扮演非常重要的作用,簡單的Director類用於指導具體建造者如何構建產品,它按一定次序調用Builder的buildPartX()方法,控制調用的先後次序,並向客戶端返回一個完整的產品對象。Direcotr針對抽象的建造者進行編程,如果需要不同的建造者,只需把建造者傳入指揮者類,無需修改之前的代碼。
在有些情況下,為了簡化系統結構,可以省略指揮者Director,指揮者不再指導產品的創建過程。而是在Builder中提供逐步構建復雜產品對象的construct()方法。
暴風影音播放器是具體的產品,實現代碼和上一篇博客一樣,這裡就不再呈現。有變化的是建造者類,播放模式.h頭文件實現代碼如下:
#ifndef _PLAY_PATTERN_H_ #define _PLAY_PATTERN_H_ #include指導者類不再指導暴風影音產品對象的創建過程,而是由抽象播放器模式StartConstruct方法來封裝播放器產品的創建過程。#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
#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中,這樣做更符合“單一職責原則”