4、引入钩子方法的建造者模式

建造者模式除了逐步构建一个复杂产品对象外,还可以通过Director类来更加精细地控制产品的创建过程,例如增加一类称之为钩子方法(HookMethod)的特殊方法来控制是否对某个buildPartX()的调用,也就是判断产品中某个部件是否需要被建造。钩子方法的返回类型通常为boolean类型,方法名一般为isXXX(),钩子方法定义在抽象建造者类中。在抽象建造者类中提供钩子方法的默认实现,具体建造者类如果不需要建造某个部件,则该建造者类覆盖抽象建造者类的钩子方法。

暴风影音播放器是具体的产品,实现代码和C++设计模式之建造者模式(一)博客一样,这里就不再呈现。而抽象播放器模式类中定义了一系列的钩子方法,并提供了默认的实现,用于判断是否需要创建对应的部件。如果具体播放器模式不需要某个部件,则具体播放器模式覆盖对应的钩子方法。

播放模式.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 * GetPlayer(){return m_pPlayer;}//是否建造播放窗口(钩子方法)virtual bool IsBuildWindow(){return true;}//是否建造播放菜单(钩子方法)virtual bool IsBuildMenu(){return true;}//是否建造播放列表(钩子方法)virtual bool IsBuildPlayList(){return true;}//是否建造播放进度条(钩子方法)virtual bool IsBuildControlBar(){return true;}//是否建造收藏列表(钩子方法)virtual bool IsBuildCollectList(){return true;}
};//完整播放模式
class FullPattern : public PlayPattern
{
public:void BuildWindow();void BuildMenu();void BuildPlayList();void BuildControlBar();void BuildCollectList();//完整播放模式不需要建造收藏列表bool IsBuildCollectList(){return false;}
};//精简播放模式
class SimplePattern : public PlayPattern
{
public:void BuildWindow();void BuildMenu();void BuildPlayList();void BuildControlBar();void BuildCollectList();//精简播放模式不需要建造播放菜单bool IsBuildMenu(){return false;}//精简播放模式不需要建造播放列表bool IsBuildPlayList(){return false;}//精简播放模式不需要建造收藏列表bool IsBuildCollectList(){return false;}
};//记忆播放模式
class MemoryPattern : public PlayPattern
{
public:void BuildWindow();void BuildMenu();void BuildPlayList();void BuildControlBar();void BuildCollectList();//记忆播放模式不需要建造播放菜单bool IsBuildMenu(){return false;}//记忆播放模式不需要建造播放列表bool IsBuildPlayList(){return false;}
};#endif

播放器模式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("收藏列表");
}

在暴风影音播放器指导者ContructManage中,调用了一系列的钩子方法,用于判断在不同播放模式下,是否需要创建对应的部件。暴风影音播放器指挥者类.h头文件实现如下:

#ifndef _CONTRUCT_MANAGE_H_
#define _CONTRUCT_MANAGE_H_
#include "PlayPattern.h"
#include "Player.h"//建造管理器
class ContructManage
{
private://具体建造者PlayPattern * m_pPlayPattern;
public://设计播放器模式(也就是设置具体建造者)void SetPlayPattern(PlayPattern * pPlayPattern);//封装建造过程,调用钩子方法,判断对应的部件是否需要建造Player * Construct();
};#endif

暴风影音播放器指挥者类Cpp文件实现如下:

#include "ContructManage.h"//设计播放器模式(也就是设置具体建造者)
void ContructManage::SetPlayPattern(PlayPattern * pPlayPattern)
{m_pPlayPattern = pPlayPattern;
}//封装建造过程,调用一系列钩子方法,判断对应的部件是否需要建造
Player * ContructManage::Construct()
{bool bRetVal = true;//根据需要建造播放窗口bRetVal = m_pPlayPattern->IsBuildWindow();if( true == bRetVal ){m_pPlayPattern->BuildWindow();}//根据需要建造播放菜单bRetVal = m_pPlayPattern->IsBuildMenu();if( true == bRetVal ){m_pPlayPattern->BuildMenu();}//根据需要建造播放列表bRetVal = m_pPlayPattern->IsBuildPlayList();if( true == bRetVal ){m_pPlayPattern->BuildPlayList();}//根据需要建造播放进度条bRetVal = m_pPlayPattern->IsBuildControlBar();if( true == bRetVal ){m_pPlayPattern->BuildControlBar();}//根据需要建造收藏列表bRetVal = m_pPlayPattern->IsBuildCollectList();if( true == bRetVal ){  m_pPlayPattern->BuildCollectList();}//返回已经建造好的播放器Player * pPlayer = m_pPlayPattern->GetPlayer();return pPlayer;
}

测试程序实现代码如下:

#include <iostream>
#include "ContructManage.h"
#include "PlayPattern.h"
#include "Player.h"using namespace std;int main()
{/***********************创建建造管理器**********************/ContructManage * pContructManage = new ContructManage();Player * pPlayer = NULL;/***********************完整播放模式************************/PlayPattern * pFullPattern = new FullPattern();cout << "完整播放模式:" << endl;pContructManage->SetPlayPattern(pFullPattern);pPlayer = pContructManage->Construct();pPlayer->Display();/***********************精简播放模式************************/PlayPattern * pSimplePattern = new SimplePattern();cout << "精简播放模式:" << endl;pContructManage->SetPlayPattern(pSimplePattern);pPlayer = pContructManage->Construct();pPlayer->Display();/***********************记忆播放模式************************/PlayPattern * pMemoryPattern = new MemoryPattern();cout << "记忆播放模式:" << endl;pContructManage->SetPlayPattern(pMemoryPattern);pPlayer = pContructManage->Construct();pPlayer->Display();/***********************销毁操作****************************/cout << endl;delete pFullPattern;pFullPattern = NULL;delete pSimplePattern;pSimplePattern = NULL;delete pMemoryPattern;pMemoryPattern = NULL;delete pContructManage;pContructManage = NULL;return 0;
}

编译并执行,结果如下:


    通过引入钩子方法,我们可以在建造者指导者类中对复杂产品的构建进行精细的控制,不仅指定buildPartX()方法的执行顺序,还可以控制是否需要执行某个buildPartX()方法。

5、建造者模式总结

建造者模式的核心在于如何一步步构建一个包含多个组成部件的完整对象,使用相同的构建过程构建不同的产品,在软件开发中,如果我们需要创建复杂对象并希望系统具备很好的灵活性和可扩展性可以考虑使用建造者模式。

1.主要优点

建造者模式的主要优点如下:

(1) 在建造者模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。建造者模式封装了产品具体的创建流程,符合"封装变化原则"。

(2) 每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。由于指挥者类针对抽象建造者编程,增加新的具体建造者无须修改原有类库的代码,系统扩展方便,符合“开闭原则”,也符合"针对抽象进行编程而不是针对具体编程原则"。

(3) 可以更加精细地控制产品的创建过程。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。

2.主要缺点

建造者模式的主要缺点如下:

(1) 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,例如很多组成部分都不相同,不适合使用建造者模式,因此其使用范围受到一定的限制。

(2) 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大,增加系统的理解难度和运行成本。

3.建造者模式的具体应用

(1)在游戏角色中,存在魔鬼、天使、英雄等角色。这些角色都包含相同的建造过程(建造头、脚、外观等),而每一个游戏角色建造方法各不相同。

(2)解析XML格式的配置文件时,需要解析配置文件的头部信息、数据体、尾部信息等。可以把解析的三个过程视为建造的三个过程。

(3)解析Rtf文档格式同样存在和解析XML格式的配置文件相同的情况。

(4)我们使用Email发送邮件的是否,需要填写邮件标题、收件人、邮件内容等信息。可以把填写邮件标题、收件人、邮件内容视为三个建造过程。

(5)我们在定义Socket网络通信协议的时候,需要定义数据祯,每祯由包头、包体、包尾组成。这样在通信的双方,就可以按照同样的格式进行收发信息。

(6)使用Gcc编译程序需要经历编译、汇编、链接等过程,最终才能形成可执行程序。

(7)我们使用美图、Photoshop软件美化图像时,得执行一系列操作(锐化、镜像等),最终才有一副绚丽的照片。

(8)在创建对话框程序过程中,会有一个向导提示每一步的创建过程。经历一系列的过程,最终才形成一个对话框。同样,在安装软件的过程中,也会出现向导让我们定制软件的某些外观或者功能。

(9)在定制Linux内核过程中,可以根据需要删减某些不需要的功能模块。定制出一个功能适中的操作系统,俗称内核裁剪,然后把裁剪后的Linux系统移植到嵌入式设备上(ARM等)。

(10)生活中的建造者模式应用: 桥梁建造、三峡工程建造、鸟巢水立方等一系列工程建造;361、安踏、九牧王一系列服装业建造;杂交水稻、转基因大米等粮食建造。

C++设计模式之建造者模式(三)相关推荐

  1. 建造者模式java_java设计模式3——建造者模式

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

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

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

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

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

  4. 07、人人都会设计模式:建造者模式--Builder

    PS:转载请注明出处 作者: TigerChain 地址: http://www.jianshu.com/p/300cbb9ee7f2 本文出自 TigerChain 简书 人人都会设计模式 教程简介 ...

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

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

  6. Java设计模式(建造者模式-适配器模式-桥接模式)

    Java设计模式Ⅲ 1.建造者模式 1.1 建造者模式概述 1.2 建造者模式的注意事项和细节 1.3 代码理解 2.适配器模式 2.1 类适配器模式 2.1.1 代码理解 2.2 对象适配器模式 2 ...

  7. java设计模式 建造模式_理解java设计模式之建造者模式

    理解java设计模式之建造者模式 发布于 2020-12-10| 复制链接 摘记: 建造者模式(Builder Pattern)主要用于"分步骤构建一个复杂的对象",在这其中&qu ...

  8. 建造者模式 php,PHP设计模式之建造者模式定义与用法简单示例

    本文实例讲述了PHP设计模式之建造者模式.分享给大家供大家参考,具体如下: 建造者模式: 将复杂对象的创建过程和表示进行分离(好吧,我也看不懂什么意思1). 来点我人类能听懂的话: 1.在客户端看来需 ...

  9. 学习《图说设计模式》建造者模式

    图说设计模式之建造者模式 1. 模式动机 无论是在现实世界中还是在软件系统中,都存在一些复杂的对象,它们拥有多个组成部分,如汽车,它包括车轮.方向盘.发送机等各种部件.而对于大多数用户而言,无须知道这 ...

最新文章

  1. [error] - Build path is incomplete. Cannot find class file for org/aspectj/weaver/refl
  2. 【转】ubuntu UltraEdit 反复试用的办法
  3. 字符串格式化---StrFormatter
  4. 计算机考研调剂规则,21考研调剂规则大变化,这类学生不能调剂!
  5. 2017 3月21日,下午
  6. 【BZOJ2005】【codevs1937】能量采集,数论练习之二维公约数求和
  7. python做视频特效_python实现超简单的视频对象提取功能
  8. 1013.windows平台下移植qtmqtt三方库
  9. php怎么使用插件下载,怎么使用下载的jquery插件
  10. 谁在控制着 iCloud 中国区账号的密钥?
  11. java xml字符串转换成对象_将XML字符串转换为对象
  12. python数据表盘_构建一个简单地分析表盘
  13. php服务器状态监测,PHP网站状态在线监控源码
  14. LTE:下行峰值速率计算
  15. Kinect黑客:机械人科技未来的转变者
  16. 《简约至上:交互式设计四策略》读书感悟
  17. Vue3和Vue2的一些区别
  18. 【技术知识】SVAC 2.0安全技术浅析
  19. kis商贸系列加密服务器,金蝶KIS商贸标准版系统登录
  20. 玩彩票赢钱概率有多少?用Python来告诉你

热门文章

  1. python 学习汇总29:各种推导式( tcy)
  2. linux 重置系统时间
  3. php socket 长链接 workerman 的使用
  4. python通过UNO访问LibreOffice/OpenOffice可以使用的命令列表、Filter列表
  5. C语言程序设计(第4版)苏小红 课后程序参考6.20
  6. 九大排序算法告诉你什么是内部排序和外部排序
  7. 2d平移、缩放、旋转、倾斜、多属性值
  8. 服务器不显示ipv4信息,【已经解决】ip addr不显示ipv4
  9. FineUI秘密花园(八) — 下拉列表控件
  10. python---locals()(全局变量)