中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。
前段时间要租房子,不可避免的要跟中介打交道,不用中介的话,就要直接找一房东,首先不好找房东,一个房东就一个房子,这个不满意就要找下一个房东,麻烦,而且房东找的也不容易,不如全部委托给房产中介,付点中介费省事。于是就从一(我自己作为一个租客)对多(多个房子的房东)变为了一(我)对一(中介),就省事很多了,我只要告诉中介我有什么需求,他马上就把合适的房源告诉我,然后我去看房。对于房东来说也是如此,一般不可能出现来一个租客就直接拍定说要租这个房子了,要经过好几个租客看房,确实很麻烦,把事情委托给房产中介就很省事了,也是从一对多变成了一对一。这其实就是中介者模式。
先定义一个中介者
interface Mediator
{
void Register(Customer customer); //客户注册
void Relay(Customer customer); //转发
}
再定义一个租客跟房东,他们对于中介都是乙方,因此定义一个抽象类,抽象接收消息和发送消息的方法
abstract class Customer
{
protected Mediator mediator;
public abstract void Receive();
public abstract void Send();
public void SetMediator(Mediator mediator)
{
this.mediator = mediator;
}
}
实现中介者接口
class MyMediator : Mediator
{
private List<Customer> customers = new List<Customer>();
public void Register(Customer customer)
{
if (!customers.Contains(customer))
{
customers.Add(customer);
customer.SetMediator(this);
}
}
public void Relay(Customer customer)
{
foreach (Customer ob in customers)
{
if (!ob.Equals(customer))
{
ob.Receive();
}
}
}
}
定义租客跟房东的实体类
class Tenant : Customer
{
public override void Receive()
{
Console.WriteLine("租客收到消息");
}
public override void Send()
{
Console.WriteLine("租客发出消息");
mediator.Relay(this); //请中介者转发
}
}
class HouseOwner : Customer
{
public override void Receive()
{
Console.WriteLine("房东收到消息");
}
public override void Send()
{
Console.WriteLine("房东发出消息");
mediator.Relay(this); //请中介者转发
}
}
调用
class Program
{
static void Main(string[] args)
{
Mediator mediator = new MyMediator();
Customer tenant = new Tenant();
Customer houseOwner = new HouseOwner();
mediator.Register(tenant);
mediator.Register(houseOwner);
tenant.Send();
Console.WriteLine("-------------");
houseOwner.Send();
Console.Read();
}
}
结果
租客发出消息
房东收到消息
-------------
房东发出消息
租客收到消息
类图
与观察者模式的区别
跟观察者模式其实有点相似,但其实本质是不同的。
- 中介者模式涉及两个概念,中介和客户。它解决的是客户之间消息传递的问题。
- 观察者模式也涉及两个概念,被观察者和观察者。它解决的是被观察者和众多观察者之间通信的问题,而不是目标之间通信的问题。观察者的场景类似于,手机应用给顾客推送消息。注意:这里的手机应用是被观察者,顾客是观察者。
优点与缺点
中介者模式的优点:
- 简化了对象之间的关系,将系统的各个对象之间的相互关系进行封装,将各个同事类解耦,使得系统变为松耦合。
- 提供系统的灵活性,使得各个同事对象独立而易于复用。
中介者模式的缺点:
- 中介者模式中,中介者角色承担了较多的责任,所以一旦这个中介者对象出现了问题,整个系统将会受到重大的影响。例如,QQ游戏中计算欢乐豆的程序出错了,这样会造成重大的影响。
- 新增加一个同事类时,不得不去修改抽象中介者类和具体中介者类,此时可以使用观察者模式和状态模式来解决这个问题。
本文主要借鉴了《Gof设计模式》