1. 程式人生 > >中介者模式分析、結構圖及基本代碼

中介者模式分析、結構圖及基本代碼

dsm size spa article 一個 tex 行為 rac err



定義:用一個中介對象來封裝一系列的對象交互。

中介者使各對象不須要顯式地相互引用。從而使其耦合松散,並且能夠獨立地改變它們之間的交互。


適用地方:中介者模式一般應用於一組對象以定義良好可是復雜的方式進行通信的場合以及想定制一個分布在多個類中的行為,而又不想生成太多的子類的場合。


長處:中介者的出現降低了各個對象的耦合,使得能夠獨立地改變和復用各個對象類和中介類,比方不論什麽國家的改變不會影響到其它國家,而僅僅是與安理會發生變化。其次,因為把對象怎樣寫作進行了抽象,將中介作為一個獨立的概念並將其封裝在一個對象中。這樣關註的對象就從對象各自本身的行為轉移到它們之間的交互上來,也就是站在一個更宏觀的角度上看待系統。

比方巴以沖突。本來僅僅能算是國與國之間的矛盾,因此各自的看法可能都比較狹隘,但站在聯合國安理會的角度,就能夠從全球化、也更客觀角度來看待這個問題。在調停和維和上作出貢獻。


缺點:因為中介者控制了集中化。於是就把交互復雜性變為了中介者的復雜性。這就使得中介者會變得比不論什麽一個對象都復雜。
結構圖:

技術分享
基本代碼:

using System;
using System.Collections.Generic;
using System.Text;

namespace 中介者模式
{
class Program
{
static void Main(string[] args)
{
ConcreteMediator m = new ConcreteMediator();

ConcreteColleague1 c1 = new ConcreteColleague1(m);
ConcreteColleague2 c2 = new ConcreteColleague2(m);

m.Colleague1 = c1;
m.Colleague2 = c2;

c1.Send("吃過飯了嗎?");
c2.Send("沒有呢,你打算請客?");

Console.Read();
}
}

abstract class Mediator
{
public abstract void Send(string message, Colleague colleague);
}

class ConcreteMediator : Mediator
{
private ConcreteColleague1 colleague1;
private ConcreteColleague2 colleague2;

public ConcreteColleague1 Colleague1
{
set { colleague1 = value; }
}

public ConcreteColleague2 Colleague2
{
set { colleague2 = value; }
}

public override void Send(string message, Colleague colleague)
{
if (colleague == colleague1)
{
colleague2.Notify(message);
}
else
{
colleague1.Notify(message);
}
}
}

abstract class Colleague
{
protected Mediator mediator;

public Colleague(Mediator mediator)
{
this.mediator = mediator;
}
}

class ConcreteColleague1 : Colleague
{
public ConcreteColleague1(Mediator mediator)
: base(mediator)
{

}

public void Send(string message)
{
mediator.Send(message, this);
}

public void Notify(string message)
{
Console.WriteLine("同事1得到信息:" + message);
}
}

class ConcreteColleague2 : Colleague
{
public ConcreteColleague2(Mediator mediator)
: base(mediator)
{
}

public void Send(string message)
{
mediator.Send(message, this);
}

public void Notify(string message)
{
Console.WriteLine("同事2得到信息:" + message);
}
}
}

中介者模式分析、結構圖及基本代碼