Mediator:Define an object that encapsulates how a set of objects interact. Mediator promotes loose coupling by keeping objects from referring to each other explicitly, and it lets you vary their interaction independently.
處理不同物件(類)之間的溝通秩序的模式,這些類之間的關係是平行獨立的關係;
實例:qt 的ui組件中的stack widget,其中每個widget都是一個parter,然後通過stack widget這個mediator來進行溝通和切換等;
實現:
.h
#pragma once
#include<iostream>
#include<vector>
#include<map>
class MediatorPattern_Test
{
};
class MediatorBase;
class PartnerBase
{
public:
PartnerBase()
{
std::cout << "partner base\n";
}
virtual ~PartnerBase()
{
std::cout << "partner base release\n";
}
virtual void SetMediator(MediatorBase* mediator);
virtual PartnerBase* GoToParter(int index);
virtual void SetIndex(int index);
virtual void ShowSelf();
private:
MediatorBase* mediator_;
int index_ = 0;
};
class MediatorBase
{
public:
MediatorBase()
{
std::cout << "mediator base\n";
}
virtual ~MediatorBase()
{
std::cout << "mediator base release\n";
}
virtual int AddPartner(PartnerBase* partner)
{
partnerList_.insert(std::pair<int, PartnerBase*>(partnerList_.size(), partner));
std::cout << partnerList_.size() << std::endl;
return partnerList_.size()-1;
}
virtual PartnerBase* ChangetoParter(int index)
{
return partnerList_[index];
}
protected:
std::map<int,PartnerBase*> partnerList_;
};
class ConcretePartner : public PartnerBase
{
public:
ConcretePartner()
{
std::cout << "ConcretePartner\n";
}
~ConcretePartner()
{
std::cout << "ConcretePartner release\n";
}
};
class ConcreteMediator :public MediatorBase
{
public:
ConcreteMediator()
{
std::cout << "ConcreteMediator\n";
}
~ConcreteMediator()
{
std::cout << "ConcreteMediator release\n";
}
int AddPartner(PartnerBase* partner)
{
partner->SetIndex(partnerList_.size());
partnerList_.insert(std::pair<int, PartnerBase*>(partnerList_.size(), partner));
std::cout << partnerList_.size() << std::endl;
return partnerList_.size()-1;
}
PartnerBase* ChangetoParter(int index)
{
return partnerList_[index];
}
//private:
// std::map<int, PartnerBase*> partnerList_;
};
.cpp
#include "MediatorPattern_Test.h"
void PartnerBase::SetMediator(MediatorBase* mediator)
{
mediator_ = mediator;
}
PartnerBase* PartnerBase::GoToParter(int index)
{
return mediator_->ChangetoParter(index);
}
void PartnerBase::SetIndex(int index)
{
index_ = index;
}
void PartnerBase::ShowSelf()
{
std::cout << "my index is :" << index_ << std::endl;
}
main:
#include"MediatorPattern_Test.h"
int main()
{
MediatorBase* mediator = new ConcreteMediator();
std::vector<int> partner_indexs;
for (int i = 0; i < 3; i++)
{
PartnerBase* partner = new ConcretePartner();
partner->SetMediator(mediator);
partner_indexs.push_back(mediator->AddPartner(partner));
}
for (int i = 0; i < partner_indexs.size(); i++)
{
mediator->ChangetoParter(partner_indexs[i])->ShowSelf();
mediator->ChangetoParter(partner_indexs[i])->GoToParter(partner_indexs[(i + 1) % partner_indexs.size()])->ShowSelf();
}
return 0;
}
運行結果: