設計模式(16)中介者模式
阿新 • • 發佈:2018-11-06
模式介紹
中介器設計模式定義了一個物件,該物件封裝了一組物件之間如何相互作用。
示例
我們想象一下電影院的快餐櫃,電影院有多個區域都有這樣的快餐櫃,我們來設計一個它們之間交流的系統。
中介者介面:
/// <summary> /// The Mediator interface, which defines a send message method which the concrete mediators must implement. /// </summary> interface Mediator { void SendMessage(string message, ConcessionStand concessionStand); }
抽象的櫃檯:
/// <summary> /// The Colleague abstract class, representing an entity involved in the conversation which should receive messages. /// </summary> abstract class ConcessionStand { protected Mediator mediator; public ConcessionStand(Mediator mediator) { this.mediator = mediator; } }
具體的櫃檯:
/// <summary> /// A Concrete Colleague class /// </summary> class NorthConcessionStand : ConcessionStand { // Constructor public NorthConcessionStand(Mediator mediator) : base(mediator) { } public void Send(string message) { Console.WriteLine("North Concession Stand sends message: " + message); mediator.SendMessage(message, this); } public void Notify(string message) { Console.WriteLine("North Concession Stand gets message: " + message); } } /// <summary> /// A Concrete Colleague class /// </summary> class SouthConcessionStand : ConcessionStand { public SouthConcessionStand(Mediator mediator) : base(mediator) { } public void Send(string message) { Console.WriteLine("South Concession Stand sends message: " + message); mediator.SendMessage(message, this); } public void Notify(string message) { Console.WriteLine("South Concession Stand gets message: " + message); } }
具體的中介者:
/// <summary>
/// The Concrete Mediator class, which implement the send message method and keep track of all participants in the conversation.
/// </summary>
class ConcessionsMediator : Mediator
{
private NorthConcessionStand _northConcessions;
private SouthConcessionStand _southConcessions;
public NorthConcessionStand NorthConcessions
{
set { _northConcessions = value; }
}
public SouthConcessionStand SouthConcessions
{
set { _southConcessions = value; }
}
public void SendMessage(string message, ConcessionStand colleague)
{
if (colleague == _northConcessions)
{
_southConcessions.Notify(message);
}
else
{
_northConcessions.Notify(message);
}
}
}
客戶端呼叫:
static void Main(string[] args)
{
ConcessionsMediator mediator = new ConcessionsMediator();
NorthConcessionStand leftKitchen = new NorthConcessionStand(mediator);
SouthConcessionStand rightKitchen = new SouthConcessionStand(mediator);
mediator.NorthConcessions = leftKitchen;
mediator.SouthConcessions = rightKitchen;
leftKitchen.Send("Can you send some popcorn?");
rightKitchen.Send("Sure thing, Kenny's on his way.");
rightKitchen.Send("Do you have any extra hot dogs? We've had a rush on them over here.");
leftKitchen.Send("Just a couple, we'll send Kenny back with them.");
Console.ReadKey();
}
總結
中介者使中介人“站在”通訊物件之間,控制他們的通訊。常用於聊天系統。
原始碼
https://github.com/exceptionnotfound/DesignPatterns/tree/master/Mediator
原文
https://www.exceptionnotfound.net/mediator-the-daily-design-pattern/