设计模式之: 媒介模式(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;
}
发布了134 篇原创文章 · 获赞 20 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/u011583798/article/details/82765691
今日推荐