一、定義
中介者模式:用一個中介對象來封裝一系列的對象交互。中介者使對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。
解釋:通俗來講,有多個對象,它們相互之間有交互?,F在為了降低它們的耦合度,提供一個中介者,相當于第三方,各個對象都通過第三方來進行相互間的邏輯操作。
二、UML類圖及基本代碼
基本代碼:
abstract class Mediator { public abstract void Send(string message, Colleague colleague); } class ConcreteMediator : Mediator { PRivate ConcreteColleage1 colleague1; private ConcreteColleage2 colleague2; public ConcreteColleage1 Colleague1 { set { colleague1 = value; } } public ConcreteColleage2 Colleague2 { set { colleague2 = value; } } public override void Send(string message, Colleague colleague) { if (colleague == colleague1) { colleague2.Receive(message); } else { colleague1.Receive(message); } } } abstract class Colleague { protected Mediator mediator; public Colleague(Mediator mediator) { this.mediator = mediator; } } class ConcreteColleage1 : Colleague { public ConcreteColleage1(Mediator mediator) : base(mediator) { } public void Send(string message) { mediator.Send(message, this); } public void Receive(string message) { Console.WriteLine("同事1得到信息:" + message); } } class ConcreteColleage2 : Colleague { public ConcreteColleage2(Mediator mediator) : base(mediator) { } public void Send(string message) { mediator.Send(message, this); } public void Receive(string message) { Console.WriteLine("同事2得到信息:" + message); } }
客戶端調用及其結果:
ConcreteMediator mediator = new ConcreteMediator(); ConcreteColleage1 c1 = new ConcreteColleage1(mediator); ConcreteColleage2 c2 = new ConcreteColleage2(mediator); mediator.Colleague1 = c1; mediator.Colleague2 = c2; c1.Send("吃飯了嗎?"); c2.Send("還沒有,你打算請客?");
三、具體實例
A和B博弈,A贏則B會輸,反之亦然。假設A和B開始時都要20塊錢,基本代碼如下:
首先構造抽象中介者類和具體中介者類:
public abstract class AbstractMediator { public abstract void AWin(int count); public abstract void BWin(int count); } public class MediatorPater : AbstractMediator { private ParterA a; private ParterB b; public ParterA A { set { a = value; } } public ParterB B { set { b = value; } } public override void AWin(int count) { a.MoneyCount += count; b.MoneyCount -= count; } public override void BWin(int count) { b.MoneyCount += count; a.MoneyCount -= count; } }
接著編寫抽象對弈者,構造具體的對弈者A和B:
public abstract class AbstractCardPartner { public int MoneyCount { get; set; } public AbstractCardPartner() { MoneyCount = 0; } public abstract void ChangeCount(int count, AbstractMediator mediator); } public class ParterA : AbstractCardPartner { public override void ChangeCount(int Count, AbstractMediator mediator) { mediator.AWin(Count); } } public class ParterB : AbstractCardPartner { public override void ChangeCount(int Count, AbstractMediator mediator) { mediator.BWin(Count); } }
客戶端調用代碼及其結果:
MediatorPater mediator = new MediatorPater(); ParterA partA = new ParterA(); ParterB partB = new ParterB(); mediator.A = partA; mediator.B = partB; partA.MoneyCount = 20; partB.MoneyCount = 20; partA.ChangeCount(7, mediator); Console.WriteLine("A 現在的錢是:{0}", partA.MoneyCount); Console.WriteLine("B 現在的錢是:{0}", partB.MoneyCount); partB.ChangeCount(11, mediator); Console.WriteLine("A 現在的錢是:{0}", partA.MoneyCount); Console.WriteLine("B 現在的錢是:{0}", partB.MoneyCount);
四、優缺點及其適用場景
優點:
1)將各個對象類解耦,同時簡化對象之間的關系,使系統變為松耦合。
2)系統更加靈活,各個對象獨立而易于復用。
缺點:
1)中介者模式中,中介者承擔了較大的責任,一旦中介者出現問題,整個系統都會受到較大的影響。
2)新增一個對象類,需要修改抽象中介者和具體中介者類。
適用場景:
中介者模式一般應用于一組對象以定義良好但是復雜的方式進行通信的場合,及想定制一個分布在多個類中的行為,而又不想生成太多的子類的場合。
新聞熱點
疑難解答