中介者模式分析、結構圖及基本代碼
定義:用一個中介對象來封裝一系列的對象交互。
中介者使各對象不須要顯式地相互引用。從而使其耦合松散,並且能夠獨立地改變它們之間的交互。
適用地方:中介者模式一般應用於一組對象以定義良好可是復雜的方式進行通信的場合以及想定制一個分布在多個類中的行為,而又不想生成太多的子類的場合。
長處:中介者的出現降低了各個對象的耦合,使得能夠獨立地改變和復用各個對象類和中介類,比方不論什麽國家的改變不會影響到其它國家,而僅僅是與安理會發生變化。其次,因為把對象怎樣寫作進行了抽象,將中介作為一個獨立的概念並將其封裝在一個對象中。這樣關註的對象就從對象各自本身的行為轉移到它們之間的交互上來,也就是站在一個更宏觀的角度上看待系統。
缺點:因為中介者控制了集中化。於是就把交互復雜性變為了中介者的復雜性。這就使得中介者會變得比不論什麽一個對象都復雜。
結構圖:
基本代碼:
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);
}
}
}
中介者模式分析、結構圖及基本代碼