3、省略指挥者Director的建造者模式
指挥者类Director在建造者模式中扮演很关键的数据。简单的Director类用于指导详细建造者怎样构建产品,它按一定次序调用Builder的buildPartX()方法。控制调用的先后次序,并向client返回一个完整的产品对象。
Direcotr针对抽象的建造者进行编程,假设须要不同的建造者。仅仅需把建造者传入指挥者类。无需改动之前的代码。
在有些情况下,为了简化系统结构,能够省略指挥者Director,指挥者不再指导产品的创建过程。而是在Builder中提供逐步构建复杂产品对象的construct()方法。
暴风影音播放器是详细的产品,实现代码和上一篇博客一样,这里就不再呈现。
有变化的是建造者类。播放模式.h头文件实现代码例如以下:
#ifndef _PLAY_PATTERN_H_ #define _PLAY_PATTERN_H_ #include <iostream> #include <string> #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 <iostream> #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中。这样做更符合“单一职责原则”