1. 程式人生 > >設計模式(16)中介者模式

設計模式(16)中介者模式

模式介紹

中介器設計模式定義了一個物件,該物件封裝了一組物件之間如何相互作用。

示例

我們想象一下電影院的快餐櫃,電影院有多個區域都有這樣的快餐櫃,我們來設計一個它們之間交流的系統。

中介者介面:

/// <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/