设为首页 加入收藏

TOP

C++设计模式之建造者模式(三)(一)
2015-07-20 17:52:21 来源: 作者: 【 】 浏览:4
Tags:设计模式 建造 模式

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

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

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

播放模式.h头文件代码如下:

#ifndef _PLAY_PATTERN_H_
#define _PLAY_PATTERN_H_
#include 
  
   
#include 
   
     #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
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇uva 1549 - Lattice Point(暴力) 下一篇ZOJ3792_Romantic Value(网络流/..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: