0
点赞
收藏
分享

微信扫一扫

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


一、概念

①、什么是中介者模式

用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示的相互引用,从而使其耦合松散,而且可以独立地改变他们之间地交互。

②、主要解决什么问题?

对象之间相互连接的激增,引起的对象之间的高耦合

③、如何解决

定义一个中介者Mediator,将对象之间的行为转移到交互上。

④、什么时候使用?

一般应用于一组对象以定义良好但是复杂的方式进行通信的场合

⑥、优缺点

优点

  1. 避免了对象之间的行为,减少了对象之间的耦合
    缺点
  2. 控制集中化,加大了中介者的复杂性

二、图

大话设计模式——中介者模式_c#

Colleague类:叫做抽象同事类,
ConcreteColleague是具体同事类,每一个具体同事类只知道自己的行为,而不了解其他同事类的情况,但他们却都认识中介者对象,
Mediator是抽象中介者,定义了同事对象到中介者对象的接口,
ConcreteMediator是具体中介者对象,实现抽象类的方法,它需要知道所有具体同事类,并从具体同事类接收信息,像具体同事对象发出命令。

三、代码

①、中介者模式

Mediator类:抽象中介类

//中介者类
abstract class Mediator
{
public abstract void Send(string message, Colleague colleague);//定义一个抽象的发送消息方法,得到同事对象和发送信息。
}

Colleague类:抽象同事类,需要得到中介者对象

//抽象同事类
class Colleague
{
protected Mediator mediator;
public Colleague (Mediator mediator )
{
this.mediator = mediator;//构造方法,得到中介者对象。
}
}

ConcreteMediator类:需要了解所有具体同事对象,收到信息并且通知具体对象

//具体中介者
class ConcreteMediator:Mediator

{
private ConcreteColleague1 colleague1;
private ConcreteColleague2 colleague2;

public ConcreteColleague1 Colleague1 //需要了解具体同事对象
{
set { colleague1 = value; }
}
public ConcreteColleague2 Colleague2
{
set { colleague2 = value; }
}

public override void Send(string message, Colleague colleague)//重写发送信息方法,根据对象做出判断,通知对象
{
if (colleague==colleague1 )
{
colleague2.Notify(message);
}
else
{
colleague1.Notify(message);
}
}
}

ConcreteColleague1-2具体同事对象,具有自己的行为,并且知道中介者对象

//具体同事类1
class ConcreteColleague1:Colleague
{
public ConcreteColleague1 (Mediator mediator ):base(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 ):base(mediator) { }//构造方法

public void Send(string message) //发送信息由中介者发出
{
mediator.Send(message, this);

}
public void Notify(string message) //得到信息
{
Console.WriteLine("同事2得到信息:"+message);
}
}

客户端代码
s

tatic void Main(string[] args)
{
ConcreteMediator m = new ConcreteMediator();

ConcreteColleague1 c1 = new ConcreteColleague1(m );//让两个具体同事类认识中介者对象
ConcreteColleague2 c2 = new ConcreteColleague2(m);

m.Colleague1 = c1; //让中介者认识各个具体同事类的对象
m.Colleague2 = c2;

c1.Send("次饭了吗?");//具体类同事类发出信息都是通过中介者转发
c2.Send("没有呢,你请客?");

Console.Read();

}

②、实例(安理会做中介)

客户端代码

static void Main(string[] args)
{
UnitedNationsSecurityCouncil UNSC = new UnitedNationsSecurityCouncil();//用联合国安全理事会类实例化一个UNSC对象

USA c1 = new USA(UNSC); //用Usa实例化一个C1对象(UNSC)
Iraq c2 = new Iraq(UNSC);

UNSC.Colleague1 = c1; //调用UNSC的Colleague1并赋一个C1
UNSC.Colleague2 = c2;

c1.Declare("不准研制核武器,否则要发动战争!"); //调用c1的显示方法
c2.Declare("我们没有核武器,也不怕侵略。");

Console.Read();
}

抽象机构联合国机构类

//联合国机构
abstract class UnitedNations
{
/// <summary>
/// 声明
/// </summary>
/// <param name="message">声明信息</param>
/// <param name="colleague">声明国家</param>
public abstract void Declare(string message, Country colleague);//定义一个抽象的发送信息方法,得到国家对象和发送信息
}

具体机构联合国安理会类

//联合国安全理事会
class UnitedNationsSecurityCouncil : UnitedNations
{
private USA colleague1;
private Iraq colleague2;

public USA Colleague1
{
set { colleague1 = value; }
}

public Iraq Colleague2
{
set { colleague2 = value; }
}

public override void Declare(string message, Country colleague)
{
if (colleague == colleague1)
{
colleague2.GetMessage(message);
}
else
{
colleague1.GetMessage(message);
}
}
}

抽象国家类

//国家
abstract class Country
{
protected UnitedNations mediator;

public Country(UnitedNations mediator) //构造方法得到Mediator
{
this.mediator = mediator;
}
}

具体国家类

//美国
class USA : Country
{
public USA(UnitedNations mediator)
: base(mediator)
{

}
//声明
public void Declare(string message)
{
mediator.Declare(message, this); //mediator发送信息
}
//获得消息
public void GetMessage(string message)
{
Console.WriteLine("美国获得对方信息:" + message);
}
}

//伊拉克
class Iraq : Country
{
public Iraq(UnitedNations mediator)
: base(mediator)
{
}

//声明
public void Declare(string message)
{
mediator.Declare(message, this);
}
//获得消息
public void GetMessage(string message)
{
Console.WriteLine("伊拉克获得对方信息:" + message);
}

}

六、涉及到的知识点

1.本例涉及到的关系

大话设计模式——中介者模式_设计模式_02

关联:表现为一个类知道另一个类
实现:

class Penguin :Bird
{
private Climate climate;//在企鹅Penguin中,引用到气候Climate对象
}

图形:实线+箭头


举报

相关推荐

0 条评论