概念:
中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。
意图:
用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
主要解决:
对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。
优点:
- 类之间各司其职,符合迪米特法则。
- 降低了对象之间的耦合性,使得对象易于独立地被复用。
- 将对象间的一对多关联转变为一对一的关联,提高系统的灵活性,使得系统易于维护和扩展。
缺点:
- 中介者模式将原本多个对象直接的相互依赖变成了中介者和多个同事类的依赖关系。当同事类越多时,中介者就会越臃肿,变得复杂且难以维护。
模式的结构
实现类图
抽象中介者(Mediator)角色: 它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。
public abstract class 中介公司
{
abstract public void 客户登记(客户 m);
}
具体中介者(Concrete Mediator)角色: 实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。
using System;
using System.Collections.Generic;
public class 租房中介 : 中介公司
{
private List<客户> mList = new List<客户>();
public override void 客户登记(客户 m)
{
if(m is 租客)
{
foreach(房东 a in mList)
{
if(a.房屋信息 == (m as 租客).租房需求)
{
Console.WriteLine("匹配成功!" + a.房屋信息);
mList.Remove(m);
return;
}
}
Console.WriteLine("当前没有匹配房屋,请过两天再来吧");
return;
}
mList.Add(m);
}
}
抽象同事类(Colleague)角色: 定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
public abstract class 客户{}
具体同事类(Concrete Colleague)角色: 是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。
public class 房东 : 客户
{
public string 房屋信息;
public 房东(string a)
{
房屋信息 = a;
}
}
public class 租客 : 客户
{
public string 租房需求;
public 租客(string s)
{
租房需求 = s;
}
}
测试
using System;
class Program
{
static void Main(string[] args)
{
客户 m1 = new 房东("三室两厅");
客户 m2 = new 房东("一室一厅");
客户 m3 = new 房东("两室一厅");
客户 n1 = new 租客("一室一厅");
客户 n2 = new 租客("两室一厅");
中介公司 s = new 租房中介();
s.客户登记(m1);
s.客户登记(m2);
s.客户登记(n1);
s.客户登记(n2);
s.客户登记(m3);
s.客户登记(n2);
Console.Read();
}
}
输出示例
设计模式------首页