• 第25章中介者模式


    一 概念

    • 中介者模式,用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

    二 UML图

    • Mediator 抽象中介者,定义了同事对象到中介者对象的接口
    • Colleague 抽象同事类
    • ConcreteMediator 具体中介者对象,实现抽象类方法,它需要知道所有具体同事类,并从具体同事接收消息,向具体同事对象发出命令。
    • ConcreteColleague1 具体同事类,每个具体同事只知道自己的行为,而不了解其它同事类的情况,但他们却都认识中介者对象

    三 C++代码实现

    #include "pch.h"
    #include <iostream>
    #include <string>
    using namespace std;
    
    class UnitedNations;
    
    //抽象的国家类 相当于Colleague
    class Country
    {
    public:
    	Country(UnitedNations* mediator)
    	{
    		this->m_mediator = mediator;
    	}
    protected:
    	UnitedNations* m_mediator;
    };
    
    //联合国类 相当于Mediator类
    class UnitedNations
    {
    public:
    	//定义一个抽象的发送消息方法,得到同事对象和发送信息
    	virtual void Declare(string message, Country* colleague) = 0;
    };
    
    //美国类 相当于ConcreteColleague1类
    class USA : public Country
    {
    public:
    	USA(UnitedNations* mediator) : Country(mediator)
    	{
    
    	}
    	//声明  发送信息通常是中介者发送出去的
    	void Declare(string message)
    	{
    		this->m_mediator->Declare(message, this);
    		
    	}
    	void GetMessage(string message)
    	{
    		cout << "美国获得对方信息: " << message << endl;
    	}
    };
    
    //伊拉克类 
    class Iraq : public Country
    {
    public:
    	Iraq(UnitedNations* mediator) : Country(mediator)
    	{
    
    	}
    	//声明  发送信息通常是中介者发送出去的
    	void Declare(string message)
    	{
    		this->m_mediator->Declare(message, this);
    	}
    	void GetMessage(string message)
    	{
    		cout << "伊拉克获得对方信息: " << message << endl;
    	}
    };
    
    //联合国安全理事会 
    //ConcreteMediator 具体中介者对象,实现抽象类的方法,它需要知道
    //所有具体同事类,并从具体同事接收消息,向具体同事对象发出命令
    class UnitedNationsSecurityCouncil : public UnitedNations
    {
    public:
    	void SetUSAColleague(USA* colleague1)
    	{
    		this->m_colleague1 = colleague1;
    	}
    	void SetIraqColleague(Iraq* colleague2)
    	{
    		this->m_colleague2 = colleague2;
    	}
    	void Declare(string message, Country* colleague) override
    	{
    		if (colleague == this->m_colleague1)
    		{
    			cout << colleague << ' '<< this->m_colleague1 << endl;
    			this->m_colleague2->GetMessage(message);
    		}
    		else
    		{
    			this->m_colleague1->GetMessage(message);
    		}
    	}
    private:
    	USA* m_colleague1;  //它需要知道所有具体同事类
    	Iraq* m_colleague2;
    };
    
    int main()
    {
    	UnitedNationsSecurityCouncil* UNSC = new UnitedNationsSecurityCouncil();
    	USA* c1 = new USA(UNSC);
    	Iraq* c2 = new Iraq(UNSC);
    
    	UNSC->SetUSAColleague(c1);
    	UNSC->SetIraqColleague(c2);
    
    	c1->Declare("不准研制核武器,否则要发动战争");
    	c2->Declare("我们没有核武器,也不怕侵略战争!");
    
    	return 0;
    }
    
    
  • 相关阅读:
    svn git 共存
    如何写软件设计文档
    spring boot requestbody string to date
    asp.net core 1.1 publish to a linux
    asp.net core 1.1 entityframework mysql
    [FPGA]記錄一些不錯的網站推薦給大家參考。
    [FPGA][DE0] Qsys 加入 FLASH 記憶體 方法及步驟
    [FPGA][Nios][DP83848] 網路開發筆記-軟體篇(1)
    [Nios][UART] 使用UART 的一些問題?
    [Nios][Eclipse] find_fast_cwd: WARNING: Couldn't compute FAST_CWD pointer
  • 原文地址:https://www.cnblogs.com/Manual-Linux/p/11156270.html
Copyright © 2020-2023  润新知