**定義:**中介者模式(MediatorPattern),用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。
**類型:**對象行為型模式
概述:
?????????面向對象編程,鼓勵將行為分散到對象當中。這樣的好處,增強對象的可復用性,但是帶來的負面作用是,當多個對象交互時不可避免地會帶來耦合性的大大提升。
?????????中介者模式的提出,就是為了解決多個對象相互交互時耦合性提升的問題。中介者模式主要通過將不同對象中涉及到交互的行為抽象出來,達到解耦的作用。這樣,每個對象都只需要和中介者打交到即可,不用關注太多的對象。
????????比如一個項目組,有一個項目經理和幾個項目開發人員。如,開發人員需要開發資料,直接找項目經理要,項目經理去協調采購人員進行采購。又如,開發人員需要了解一個具體的需求,也直接找項目經理,然后項目經理去找銷售人員了解更詳細的需求。總之,開發人員,需要什么,都直接找項目經理就可以了,而不必關心去找誰,并如何跟對象交流。這樣看來,開發人員就不會和其他對象產生交互,也就不會有很大的耦合性,比較純粹,專注于自己的開發就好。這樣,只要技術過關的人都可以充當開發人員,而不必要有各種關系,溝通技巧之類的。提高了開發人員的可復用性。
類圖:

參與者:
1. Mediator,提供與Staff交互的接口。
1. ProjectManger,實現具體的接口來完成和不同職員的交互。
1. Staff,提供成員與Mediator交互的基本接口。
1. Developer,Buyer,Seller,完成各自的工作,然后通過Meditor的接口告訴具體的ProjectManager。
示例代碼:
~~~
using System;
using System.Collections.Generic;
using System.Text;
namespace MediatorPattern
{
abstract class Mediator
{
public abstract void Comunicate(string message, Staff colleague);
}
class ProjectManger : Mediator
{
private Developer staff1;
private Buyer staff2;
private Seller staff3;
public Developer Staff1
{
set { staff1 = value; }
}
public Buyer Staff2
{
set { staff2 = value; }
}
public Seller Staff3
{
set { staff3 = value; }
}
public override void Comunicate(string message, Staff staff)
{
staff.Notify(message);
}
}
abstract class Staff
{
protected Mediator mediator;
public Staff(Mediator mediator)
{
this.mediator = mediator;
}
public abstract void Notify(string message);
}
class Developer : Staff
{
public Developer(Mediator mediator)
: base(mediator)
{
}
public void Ask(string message)
{
mediator.Comunicate(message, this);
}
public override void Notify(string message)
{
Console.WriteLine("開發人員完成開發任務" + message);
}
}
class Buyer : Staff
{
public Buyer(Mediator mediator)
: base(mediator)
{
}
public void Send(string message)
{
mediator.Comunicate(message, this);
}
public override void Notify(string message)
{
Console.WriteLine("采購人員已經知道" + message);
}
}
class Seller : Staff
{
public Seller(Mediator mediator)
: base(mediator)
{
}
public void Tell(string message)
{
mediator.Comunicate(message, this);
}
public override void Notify(string message)
{
Console.WriteLine("銷售人員已經知道" + message);
}
}
class Program
{
static void Main(string[] args)
{
ProjectManger mediator = new ProjectManger();
Developer staff1 = new Developer(mediator);
Buyer staff2 = new Buyer(mediator);
Seller staff3 = new Seller(mediator);
mediator.Staff1 = staff1;
mediator.Staff2 = staff2;
mediator.Staff3 = staff3;
staff1.Ask("需要電路板");
staff2.Send("已經采購電路板");
staff1.Ask("需要客戶需求");
staff3.Tell("已經去調查");
}
}
}
~~~
**適用性:**
1. 一組對象以定義良好但是復雜的方式進行通信。產生的相互依賴關系結構混亂且難以理解。
1. 一個對象引用其他很多對象并且直接與這些對象通信,導致難以復用該對象。
1. 想定制一個分面在多個類中的行為,而又不想生成太多的子類。
優缺點:
1. 優點,降低對象之間的耦合度,提高對象的可復用用程度。
1. 缺點,如果交互的對象過多,中介者會非常復雜,難于管理。
參考資料:
1. 《設計模式——可復用面向對象軟件基礎》
1. 《大話設計模式》
- 前言
- 設計模式六大原則
- 1——創建型模式之簡單工廠模式
- 2——創建型模式之工廠方法模式
- 3——創建型模式之抽象工廠模式
- 4——創建型模式之單例模式
- 5——創建型模式之建造者模式
- 6——創建型模式之原型模式
- 7——結構型模式之適配器模式
- 8——結構型模式之橋接模式
- 9——結構型模式之組合模式
- 10——結構型模式之裝飾者模式
- 11——結構型模式之外觀模式
- 12——結構型模式之享元模式
- 13——結構型模式之代理模式
- 14——行為型模式之職責鏈模式
- 15——行為型模式之命令模式
- 16——行為型模式之解釋器模式
- 17——行為型模式之迭代器模式
- 18——行為型模式之中介者模式
- 19——行為型模式之備忘錄模式
- 20——行為型模式之觀察者模式
- 21——行為型模式之狀態模式
- 22——行為型模式之策略模式
- 23——行為型模式之模板方法模型
- 24——行為型模式之訪問者模式
- 設計模式總結