设计模式之: 媒介模式(mediator)

媒介模式


用一个媒介对象来封装一系列的对象交互。媒介者使得各对象不需要显式地相互引用,从而使对象之间松散耦合,使得一方的修改对另一方的影响降到最低;例如:地面防空雷达和空中预警机通过数据链媒介彼此交换信息。


c++实现

#include<iostream>

using namespace std;

typedef std::string Data;

class Equpment
{
public:
	Equpment(){};
	virtual ~Equpment(){};
	virtual Data& GetData() = 0;
	virtual void SetData(Data& data) = 0;
};

class AirDefenseRadar : public Equpment
{
public:
	AirDefenseRadar(std::string& name)
		: name_(name)
	{}

	virtual ~AirDefenseRadar(){}
	
	virtual void SetData(Data& data) override {
		data_ = data;
	}

	virtual Data& GetData() override {
		return data_;
	}

private:
	std::string name_;
	Data data_;
};

class AirEarlyWarning: public Equpment
{
public:
	AirEarlyWarning(std::string& name)
		: name_(name)
	{}

	virtual ~AirEarlyWarning(){}
	
	virtual void SetData(Data& data) override {
		data_ = data ;
	}

	virtual Data& GetData() override {
		return data_;
	}

private:
	std::string name_;
	Data data_;
};

class DataLink
{
public:
	DataLink(Equpment* pEa, Equpment* pEb)	
		: Ea_(pEa),
		  Eb_(pEb)
	{}

	virtual ~DataLink(){}

	void DataTramsmitEa2Eb(){
		Eb_->SetData(Ea_->GetData());
	}

	void DataTramsmitEb2Ea(){
		Ea_->SetData(Eb_->GetData());
	}

private:
	Equpment* Ea_;
	Equpment* Eb_;
};


int main()
{
	std::string name = "AMDR";
	AirDefenseRadar* AMDR = new AirDefenseRadar(name);
	Data info("From AMDR: The target is detected, please confirm!!!\n");
	AMDR->SetData(info);

	name = "AWACS";
	AirEarlyWarning* AWACS = new AirEarlyWarning(name);
	info = "From AWACS: Detect 10 F22 fighters!\n";
	AWACS->SetData(info);


	DataLink* dl = new DataLink(AMDR, AWACS);

	std::cout << "Default: \n";
	std::cout << AWACS->GetData();
	std::cout << AMDR->GetData();

	std::cout << "Step1: \n";
	dl->DataTramsmitEa2Eb();
	std::cout << AWACS->GetData();
	std::cout << AMDR->GetData();


	std::cout << "Step2: \n";
	AWACS->SetData(info);
	dl->DataTramsmitEb2Ea();
	std::cout << AWACS->GetData();
	std::cout << AMDR->GetData();

	return 0;
}

c实现

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef char Data;

typedef struct _Equpment
{
    char name_[64];
	Data data_[64];
	void (*SetData)(struct _Equpment* this, Data* data);
	Data* (*GetData)(struct _Equpment* this);
}Equpment;

typedef struct _AirDefenceRadar
{
	Equpment adr;
}AirDefenceRadar;

typedef struct _AirEarlyWaring
{
	Equpment aew;
}AirEarlyWaring;

void SetData(Equpment* this, Data* data)
{
	memset(this->data_, 0, sizeof(this->data_));
	strcpy(this->data_, data);
}

Data* GetData(Equpment* this)
{
	return this->data_;	
}

typedef struct _DataLink
{
	void (*TramsmitDataA2B)(Equpment* this, Equpment* that);
	void (*TramsmitDataB2A)(Equpment* this, Equpment* that);
}DataLink;


void TramsmitDataA2B(Equpment* this, Equpment* that)
{
    printf("%s\n", __func__);
	that->SetData(that, this->GetData(this));
}

void TramsmitDataB2A(Equpment* this, Equpment* that)
{
    printf("%s\n", __func__);
	this->SetData(this, that->GetData(that));
}

AirDefenceRadar AMDR = {
    .adr = {
		.name_ = "AMDR", 
		.data_ = "From AMDR: The target is detected, please confirm!!!",
		.SetData = SetData,
		.GetData = GetData,
	},
};

AirEarlyWaring AWACS = {
    .aew = {
		.name_ = "AWACS", 
		.data_ = "From AWACS: 10 F22 fighters!",
		.SetData = SetData,
		.GetData = GetData,
	},
};

DataLink DL = {
    .TramsmitDataA2B = TramsmitDataA2B,
    .TramsmitDataB2A = TramsmitDataB2A,
};

int main(int argc, const char* argv[])
{
	printf("Orignal: \n");
	printf("%s\n", AMDR.adr.GetData((Equpment*)&AMDR));
	printf("%s\n", AWACS.aew.GetData((Equpment*)&AWACS));

	printf("Step1: \n");
	DL.TramsmitDataA2B(&AMDR, &AWACS);
	printf("%s\n", AMDR.adr.GetData((Equpment*)&AMDR));
	printf("%s\n", AWACS.aew.GetData((Equpment*)&AWACS));

	printf("Step2: \n");
	Data data[64] = "From AWACS: 10 F22 fighters!";
	AWACS.aew.SetData(&AWACS, data);
	DL.TramsmitDataB2A(&AMDR, &AWACS);
	printf("%s\n", AMDR.adr.GetData((Equpment*)&AMDR));
	printf("%s\n", AWACS.aew.GetData((Equpment*)&AWACS));

    return 0;
}
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可 6私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值