C++设计模式之建造者模式(三)
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) 在建造者模式中,client不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得同样的创建过程能够创建不同的产品对象。建造者模式封装了产品详细的创建流程,符合"封装变化原则"。
(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)生活中的建造者模式应用: 桥梁建造、三峡project建造、鸟巢水立方等一系列project建造;361、安踏、九牧王一系列服装业建造。杂交水稻、转基因大米等粮食建造。
C++设计模式之建造者模式(三)的更多相关文章
- Java设计模式之建造者模式(Builder)
前言: 最近一直在学习okHttp,也对其做了一些整理,okHttp和Retrofit结合大大加速我们的开发效率,源码里面采用了很多设计模式,今天我们来学习一下其中的设计模式之一建造者模式. 建造者模 ...
- C#设计模式(5)——建造者模式(Builder Pattern)
一.引言 在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成.例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象, ...
- 折腾Java设计模式之建造者模式
博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...
- C#设计模式之四建造者模式(Builder Pattern)【创建型】
一.引言 今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的,英文名称是Builder Pattern.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一 ...
- Java 设计模式之建造者模式(四)
原文地址:Java 设计模式之建造者模式(四) 博客地址:http://www.extlight.com 一.前言 今天继续介绍 Java 设计模式中的创建型模式--建造者模式.上篇设计模式的主题为 ...
- java设计模式3——建造者模式
java设计模式3--建造者模式 1.建造者模式介绍: 建造者模式属于创建型模式,他提供了一种创建对象得最佳方式 定义: 将一个复杂对象的构建和与它的表示分离,使得同样的构建过程可以创建不同的表示 主 ...
- 【GOF23设计模式】建造者模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]建造者模式详解类图关系 建造飞船 package com.test.Builder; public class AirShi ...
- 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)
原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...
- GOF23设计模式之建造者模式
GOF23设计模式之建造者模式 场景: 我们要建造一个复杂的产品.比如:神州飞船,Iphone.这个复杂的产品的创建.有这样的一个问题需要处理: 装配这些子组件是不是有个步骤问题? 实际开发中,我们所 ...
随机推荐
- arm-linux-gcc下载与安装
在RHEL 5平台上安装配置arm-linux-gcc 2011-02-23 19:35:40| 分类: 嵌入式开发环境 | 标签: |字号大中小 订阅 . 在linux平台上安装好的基础上,开 ...
- 屏蔽EditText长按导致的弹出输入法的对话框
做了个能手动拖动的EditText,但有个问题导致的体验很不好,就是手放上去开始拖,拖到一段距离后弹出个输入法的对话框,这根本不是我想要的效果,于是就想屏蔽它,结果在网上找到一句代码,放上去 顿时解决 ...
- mysql-5.6.13在windows平台下的安装、使用(图解)
本文同步至:http://www.waylau.com/mysql-5-6-13-windows-platform-installation-use-graphic/ 一. 首先电脑要具备.Net F ...
- LintCode 二叉树的层次遍历 II
中等 二叉树的层次遍历 II 查看执行结果 42% 通过 给出一棵二叉树,返回其节点值从底向上的层次序遍历(按从叶节点所在层到根节点所在的层遍历,然后逐层从左往右遍历) 您在真实的面试中是否遇到过这个 ...
- C#递归复制文件夹
/// <param name="sources">原路徑</param> /// <param name="dest">目 ...
- iText 文本
iText中用文本块(Chunk).短语(Phrase)和段落(paragraph)处理文本. 文本块(Chunk)是处理文本的最小单位,有一串带格式(包括字体.颜色.大小)的字符串组成.如以下代码就 ...
- ExtJs4 笔记(12) Ext.toolbar.Toolbar 工具栏、Ext.toolbar.Paging 分页栏、Ext.ux.statusbar.StatusBar 状态栏
本篇讲解三个工具栏控件.其中Ext.toolbar.Toolbar可以用来放置一些工具类操控按钮和菜单,Ext.toolbar.Paging专门用来控制数据集的分页展示,Ext.ux.statusba ...
- hdu1869 六度分离(Floyd)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1869 转载请注明出处:http://blog.csdn.net/u012860063?viewmode ...
- C++ 虚函数表解析(比较清楚,还可打印虚函数地址)
C++ 虚函数表解析 陈皓 http://blog.csdn.net/haoel 前言 C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父 ...
- 几款屏幕录制软件 ActivePresente
几款屏幕录制软件,最强大是 ActivePresenter ,免费版, 足以应对我们日常需求.列表如下 支持系统:W-Windows,L-Linux,M-Mac 软件 格式 W L M 免费 说明 ...