您的位置:首页 > 其它

大话设计模式之中介者模式

2017-10-02 11:15 274 查看
abstract class Mediator {
public abstract void Send(string mess,Colleague col);
}
abstract class Colleague {
protected Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
}
class ConcreteMediator : Mediator {
private ConcreteColleague1 c1;
private ConcreteColleague2 c2;
// 需要了解所有具体同事对象
public void SetC1(ConcreteColleague1 c1){
this.c1 = c1;
}
public void SetC2(ConcreteColleague2 c2){
this.c2 = c2;
}
public override void Send(string mess,Colleague colleague) {
if(colleague == c1){
c2.Notify(message);
}else{
c1.Notify(message);
}
}
}
// 同事1
class ConcreteColleague1 : Colleague {
public ConcreteColleague1(Mediator mediator) {}
public void Send(string message) {
mediator.Send(message,this);
}
public void Notify(string message){
Console.WriteLine("同事1得到消息"+message);
}
}
// 同事2
class ConcreteColleague2 : Colleague {
public ConcreteColleague2(Mediator mediator) {}
public void Send(string message) {
mediator.Send(message,this);
}
public void Notify(string message){
Console.WriteLine("同事2得到消息"+message);
}
}
static void Main(string[] args){
ConcreteMediator m = new ConcreteMediator();
//让两个具体同事类认识中介者对象
ConcreteColleague1 c1 = new ConcreteColleague1(m);
ConcreteColleague2 c2 = new ConcreteColleague2(m);
// 让中介者认识各个具体同事类对象
m.SetC1(c1);
m.SetC2(c2);
c1.Send("吃过饭了吗");
c2.Send("没有呢,你打算请客吗");
}


安理会做中介

// 联合国机构
abstract class UnitedNations {
public abstract void Declare(string message,Country country);
}
//国家类
abstract class Country {
protected UnitedNations mediator;
public Country(UnitedNations mediator){
this.mediator = mediator;
}
}
class USA : Country {
public USA(UnitedNations mediator){}
public void Declare(string message) {
mediator.Declare(message,this);
}
public void GetMessage(string message){
Console.WriteLine("美国获得对方信息" + message);
}
}
class Iraq : Country {
public Iraq(UnitedNations mediator){}
public void Declare(string message) {
mediator.Declare(message,this);
}
public void GetMessage(string message){
Console.WriteLine("伊拉克获得对方信息"+ message);
}
}
class UnitedNationsSecurityCouncil : UnitedNations {
private USA usa;
private Iraq iraq;
//set usa
//set iraq
public override void Declare(string message,Country country){
if(country == usa){
iraq.GetMessage(message);
}else{
iraq.GetMessage(message);
}
}

}
static void Main(string[]args){
UnitedNationsSecurityCouncil unsc = new UnitedNationsSecurityCouncil();
USA u = new USA(unsc);
Iraq i = new Iraq(unsc);
unsc.usa = u;
unsc.iraq = i;
u.Declare("不准研制核武器,否则要发动战争");
i.Declare("我们没有核武器,也不怕侵略");
}

中介者模式优缺点:

优点在于中介的出现减少各个交互对象的耦合,使得可以独立地改变和复用各个交互对象和中介者,由于把对象如何写协作进行了抽象,把中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到它们的交互上来,也就站在一个更宏观的角度去看待系统

缺点在于:中介者会随着交互对象的增多而变得异常复杂

适用场景:

一般应用于一组对象以定义良好但是复杂的方式进行通信的场合,以及想定制一个分布在多个类的行为,而又不想生成太多子类的场合。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: