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

C++设计模式之建造者模式(二)的更多相关文章

  1. C#设计模式(5)——建造者模式(Builder Pattern)

    一.引言 在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成.例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象, ...

  2. C#设计模式之四建造者模式(Builder Pattern)【创建型】

    一.引言 今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的,英文名称是Builder Pattern.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一 ...

  3. Java 设计模式之建造者模式(四)

    原文地址:Java 设计模式之建造者模式(四) 博客地址:http://www.extlight.com 一.前言 今天继续介绍 Java 设计模式中的创建型模式--建造者模式.上篇设计模式的主题为 ...

  4. java设计模式3——建造者模式

    java设计模式3--建造者模式 1.建造者模式介绍: 建造者模式属于创建型模式,他提供了一种创建对象得最佳方式 定义: 将一个复杂对象的构建和与它的表示分离,使得同样的构建过程可以创建不同的表示 主 ...

  5. Java设计模式之建造者模式(Builder)

    前言: 最近一直在学习okHttp,也对其做了一些整理,okHttp和Retrofit结合大大加速我们的开发效率,源码里面采用了很多设计模式,今天我们来学习一下其中的设计模式之一建造者模式. 建造者模 ...

  6. 【GOF23设计模式】建造者模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]建造者模式详解类图关系 建造飞船 package com.test.Builder; public class AirShi ...

  7. C++设计模式之建造者模式(三)

    4.引入钩子方法的建造者模式 建造者模式除了逐步构建一个复杂产品对象外.还能够通过Director类来更加精细地控制产品的创建过程.比如添加一类称之为钩子方法(HookMethod)的特殊方法来控制是 ...

  8. 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)

    原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...

  9. 折腾Java设计模式之建造者模式

    博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...

随机推荐

  1. profile_oracle设置某用户password永只是期

    原创作品.出自 "深蓝的blog" 博客,深蓝的blog:http://blog.csdn.net/huangyanlong/article/details/46888139 or ...

  2. postgresql 如何导入sql文件

    (1)不能使用pgadmin 执行Copy语句,目前客户端还不支持这种写法. (2)打开sql shell,执行如下操作 \i C:/Users/Peter_Youny/Desktop/ischool ...

  3. JMeter 十:录制脚本--使用bodboy

    1. 下载bodboy 下载地址:http://www.badboy.com.au/download 这里填写完基本信息,点击下方的Continue即可跳转到下载页面. 任选一个version,点击后 ...

  4. 用Markdown写博客快速入门

    Markdown,简单来说,就是一种可以方便转换为HTML的带标记符号纯文本. 它是对我等键盘党的福音:我不用再费劲挪动鼠标去按加粗.设置段落了,用键盘输入所有文本,一气呵成. 最重要的是,cnblo ...

  5. 学会Git玩转Github笔记(二)——Git使用

    一.Git基本工作流程 Git工作区域 向仓库中添加文件流程 二. Git初始化及仓库创建和操作 基本信息设置 . 设置用户名 git config --global user.name 'itcas ...

  6. jumpserver v0.5.0 创建用户和管理机器

    用户管理-创建用户    data 用户详情 如下 创建用户组 data 资产列表添加资产 jumpserver 的 root 公钥需保持到 后端服务器的 authorized_keys 里, 然后测 ...

  7. C#指南,重温基础,展望远方!(5)C#语句

    程序操作使用语句进行表示. C# 支持几种不同的语句,其中许多语句是从嵌入语句的角度来定义的. 使用代码块,可以在允许编写一个语句的上下文中编写多个语句. 代码块是由一系列在分隔符 { 和 } 内编写 ...

  8. vue cli3.0 build 打包 的 js 文件添加版本号 解决 js 缓存问题

    在 vue.config.js 的文件中加入下面这段话 // vue.config.jsconst Timestamp = new Date().getTime();module.exports = ...

  9. windows Service 2012 系统时间格式带中文

    C# 获取DataTime.Now   显示     2019年4月23日 下午 10:03:00 导致转换格式失败, 因为 源码中写的是   DataTime.Now.ToString();   输 ...

  10. Android 自己定义ViewGroup手把手教你实现ArcMenu

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37567907 逛eoe发现这种UI效果,感觉非常不错,后来知道github上有这 ...