- 用一個仲介物件來封裝一系列的物件互動。仲介者使各物件不需要顯式地互相參考,從而使其耦合鬆散,而且可以獨立地改變它們之間的互動。
- 優點
- Mediator的出現減少了各個Colleague的耦合,所以可以獨立改變和複用各個Colleague類別和Mediator
- 把物件協作進行了抽象,將中介作為一個獨立的概念並將其封裝在一個物件中,這樣焦點的物件就從物件各自本身的行為轉移到它們之間的互動上來,亦即站在一個更宏觀的角度去看待系統。
- 缺點
- 由於ConcreteMediator控制了集中化,於是就把互動複雜性變為了仲介者的複雜性,這就使得仲介者會變得比任何一個ConcreteColleague都複雜
- 一般應用於一組物件已定義良好,但是複雜的方式進行通訊的場合
 |
| 基本架構圖 |
 |
| 實例架構圖 |
using System;
namespace DPExample
{
abstract class 聯合國機構
{
public abstract void Declare (string message, 國家 colleague);
}
abstract class 國家
{
protected 聯合國機構 mediator;
public 國家(聯合國機構 mediator)
{
this.mediator = mediator;
}
}
class 美國 : 國家
{
public 美國(聯合國機構 mediator) : base (mediator)
{}
public void Declare (string message)
{
mediator.Declare (message, this);
}
public void GetMessage (string message)
{
Console.WriteLine ("美國獲得對方資訊:" + message);
}
}
class 伊拉克 : 國家
{
public 伊拉克(聯合國機構 mediator) : base (mediator)
{}
public void Declare (string message)
{
mediator.Declare (message, this);
}
public void GetMessage (string message)
{
Console.WriteLine ("伊拉克獲得對方資訊:" + message);
}
}
class 聯合國安全理事會 : 聯合國機構
{
private 美國 colleague1;
private 伊拉克 colleague2;
public 美國 Colleague1
{
set { colleague1 = value; }
}
public 伊拉克 Colleague2
{
set { colleague2 = value; }
}
public override void Declare (string message, 國家 colleague)
{
if (colleague == colleague1)
colleague2.GetMessage (message);
else
colleague1.GetMessage (message);
}
}
}
using System;
namespace DPExample
{
public class Program
{
static void Main ()
{
聯合國安全理事會 UNSC = new 聯合國安全理事會();
美國 c1 = new 美國(UNSC);
伊拉克 c2 = new 伊拉克(UNSC);
UNSC.Colleague1 = c1;
UNSC.Colleague2 = c2;
c1.Declare("不准研製核武器,否則要發動戰爭!");
c2.Declare("我們沒有核武器,也不怕侵略。");
}
}
}
留言
張貼留言