您的位置:首页 > 编程语言 > C语言/C++

C++设计模式之建造者模式(二)

2017-07-30 16:02 141 查看

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中。这样做更符合“单一职责原则”


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: