目錄
- 定義與特點
- 結構與實作
- 模式的結構
- 模式的實作
- 應用場景
- 擴展:簡化中介者模式
在現實生活中,常常會出現好多物件之間存在復雜的互動關系,這種互動關系常常是“網狀結構”,它要求每個物件都必須知道它需要互動的物件,
如果把這種“網狀結構”改為“星形結構”的話,將大大降低它們之間的“耦合性”,這時只要找一個“中介者”就可以了,
例如,你剛剛參力口作業想租房,可以找“房屋中介”;或者,自己剛剛到一個陌生城市找作業,可以找“人才交流中心”幫忙,
在軟體的開發程序中,這樣的例子也很多,例如,在 MVC 框架中,控制器(C)就是模型(M)和視圖(V)的中介者;還有大家常用的 QQ 聊天程式的“中介者”是 QQ 服務器,
所有這些,都可以采用“中介者模式”來實作,它將大大降低物件之間的耦合性,提高系統的靈活性,
定義與特點
中介者(Mediator)模式的定義:定義一個中介物件來封裝一系列物件之間的互動,使原有物件之間的耦合松散,且可以獨立地改變它們之間的互動,中介者模式又叫調停模式,它是迪米特法則的典型應用,
中介者模式是一種物件行為型模式,其主要優點如下:
- 降低了物件之間的耦合性,使得物件易于獨立地被復用,
- 將物件間的一對多關聯轉變為一對一的關聯,提高系統的靈活性,使得系統易于維護和擴展,
其主要缺點是:當同事類太多時,中介者的職責將很大,它會變得復雜而龐大,以至于系統難以維護,
結構與實作
中介者模式實作的關鍵是找出“中介者”,下面對它的結構和實作進行分析,
模式的結構
中介者模式包含以下主要角色:
- 抽象中介者(Mediator)角色:它是中介者的介面,提供了同事物件注冊與轉發同事物件資訊的抽象方法,
- 具體中介者(Concrete Mediator)角色:實作中介者介面,定義一個 List 來管理同事物件,協調各個同事角色之間的互動關系,因此它依賴于同事角色,
- 抽象同事類(Colleague)角色:定義同事類的介面,保存中介者物件,提供同事物件互動的抽象方法,實作所有相互影響的同事類的公共功能,
- 具體同事類(Concrete Colleague)角色:是抽象同事類的實作者,當需要與其他同事物件互動時,由中介者物件負責后續的互動,
中介者模式的結構圖如圖所示:

模式的實作
中介者模式的實作代碼如下:
class Program
{
static void Main(string[] args)
{
Mediator md=new ConcreteMediator();
Colleague c1,c2;
c1=new ConcreteColleague1();
c2=new ConcreteColleague2();
md.Register(c1);
md.Register(c2);
c1.Send();
Console.WriteLine("-------------");
c2.Send();
Console.Read();
}
}
//抽象中介者
public abstract class Mediator
{
// 登記
public abstract void Register(Colleague colleague);
// 轉發
public abstract void Relay(Colleague colleague);
}
//具體中介者
public class ConcreteMediator : Mediator
{
private List<Colleague> colleagues=new List<Colleague>();
public override void Register(Colleague colleague)
{
if(!colleagues.Contains(colleague))
{
colleagues.Add(colleague);
colleague.SetMediator(this);
}
}
public override void Relay(Colleague colleague)
{
foreach (var item in colleagues)
{
if (!item.Equals(colleague))
{
item.Receive();
}
}
}
}
//抽象同事類
public abstract class Colleague
{
protected Mediator mediator;
public void SetMediator(Mediator mediator)
{
this.mediator=mediator;
}
public abstract void Receive();
public abstract void Send();
}
//具體同事類
public class ConcreteColleague1 : Colleague
{
public override void Receive()
{
Console.WriteLine("具體同事類1收到請求,");
}
public override void Send()
{
Console.WriteLine("具體同事類1發出請求,");
mediator.Relay(this); //請中介者轉發
}
}
//具體同事類
public class ConcreteColleague2 : Colleague
{
public override void Receive()
{
Console.WriteLine("具體同事類2收到請求,");
}
public override void Send()
{
Console.WriteLine("具體同事類2發出請求,");
mediator.Relay(this); //請中介者轉發
}
}
程式的運行結果如下:
具體同事類1發出請求,
具體同事類2收到請求,
-------------
具體同事類2發出請求,
具體同事類1收到請求,
應用場景
前面分析了中介者模式的結構與特點,下面分析其以下應用場景:
- 當物件之間存在復雜的網狀結構關系而導致依賴關系混亂且難以復用時,
- 當想創建一個運行于多個類之間的物件,又不想生成新的子類時,
擴展:簡化中介者模式
在實際開發中,通常采用以下兩種方法來簡化中介者模式,使開發變得更簡單:
- 不定義中介者介面,把具體中介者物件實作成為單例,
- 同事物件不持有中介者,而是在需要的時直接獲取中介者物件并呼叫,
下圖所示是簡化中介者模式的結構圖:

程式代碼如下:
class Program
{
static void Main(string[] args)
{
ISimpleColleague c1,c2;
c1=new SimpleConcreteColleague1();
c2=new SimpleConcreteColleague2();
c1.Send();
Console.WriteLine("-----------------");
c2.Send();
Console.Read();
}
}
//簡單單例中介者
public class SimpleMediator
{
private static SimpleMediator smd=new SimpleMediator();
private List<ISimpleColleague> colleagues=new List<ISimpleColleague>();
private SimpleMediator(){}
public static SimpleMediator GetMediator()
{
return smd;
}
public void Register(ISimpleColleague colleague)
{
if(!colleagues.Contains(colleague))
{
colleagues.Add(colleague);
}
}
public void Relay(ISimpleColleague scl)
{
foreach (var item in colleagues)
{
if (!item.Equals(scl))
{
item.Receive();
}
}
}
}
//抽象同事
public interface ISimpleColleague
{
void Receive();
void Send();
}
//具體同事1
public class SimpleConcreteColleague1 : ISimpleColleague
{
public SimpleConcreteColleague1()
{
SimpleMediator smd=SimpleMediator.GetMediator();
smd.Register(this);
}
public void Receive()
{
Console.WriteLine("具體同事類1:收到請求,");
}
public void Send()
{
SimpleMediator smd=SimpleMediator.GetMediator();
Console.WriteLine("具體同事類1:發出請求...");
smd.Relay(this); //請中介者轉發
}
}
//具體同事2
public class SimpleConcreteColleague2 : ISimpleColleague
{
public SimpleConcreteColleague2()
{
SimpleMediator smd=SimpleMediator.GetMediator();
smd.Register(this);
}
public void Receive()
{
Console.WriteLine("具體同事類2:收到請求,");
}
public void Send()
{
SimpleMediator smd=SimpleMediator.GetMediator();
Console.WriteLine("具體同事類2:發出請求...");
smd.Relay(this); //請中介者轉發
}
}
程式運行結果如下:
具體同事類1:發出請求...
具體同事類2:收到請求,
-----------------
具體同事類2:發出請求...
具體同事類1:收到請求,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/1067.html
標籤:設計模式
上一篇:行為型模式之觀察者模式
下一篇:設計模式(21) 狀態模式
