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


    3、省略指挥者Director的建造者模式

        指挥者类Director在建造者模式中扮演很关键的数据。简单的Director类用于指导详细建造者怎样构建产品,它按一定次序调用BuilderbuildPartX()方法。控制调用的先后次序,并向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中。这样做更符合“单一职责原则”


  • 相关阅读:
    动画 + 设置contentoffset,然后就 蛋疼了,
    xmpp这一段蛋疼的 坑,
    项目,
    一段测试代码,哦哦哦,
    libresolv,
    mutating method sent to immutable object'
    解析json,是还是不是,
    济南学习 Day 4 T1 am
    济南学习 Day 3 T3 pm
    济南学习 Day 3 T2 pm
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/7259418.html
Copyright © 2020-2023  润新知