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