天天看點

C# 設計模式-中介者(Mediator)

用一個中介對象來封裝一系列對象的互動,使得各對象不需要顯示地互相引用,進而耦合松散。

主要組成:

Mediator-中介者父類或接口

ConcreteMediator-具體中介者

Colleague-同僚父類

ConcreteColleague-具體同僚類

相關類:

using System;
using System.Collections.Generic;

namespace Mediator
{
    /// <summary>
    /// 中介者父類或接口
    /// </summary>
    abstract class Mediator
    {
        public abstract void Connect(int dialNumber);
    }

    /// <summary>
    /// 基站(具體中介者)
    /// </summary>
    class BaseStationMediator : Mediator
    {
        Dictionary<int, PhoneClass> numberAndPhones = new Dictionary<int, PhoneClass>();

        public void AddPhone(PhoneClass phone)
        {
            if (numberAndPhones.ContainsKey(phone.MyPhoneNumber))
            {
                return;
            }
            numberAndPhones.Add(phone.MyPhoneNumber, phone);
        }
        //基站轉接号碼
        public override void Connect(int dialNumber)
        {
            if (numberAndPhones.ContainsKey(dialNumber))
            {
                Console.WriteLine("接通号碼:{0}", dialNumber);
            }
            else
            {
                Console.WriteLine("對不起,您撥打的号碼是空号!");
            }
        }
    }

    /// <summary>
    /// 電話父類
    /// </summary>
    abstract class PhoneClass
    {
        //基站
        public Mediator BaseStation;

        /// <summary>
        /// 本機号碼
        /// </summary>
        public int MyPhoneNumber { get; set; }

        public PhoneClass(int myPhoneNumber, Mediator baseStation)
        {
            MyPhoneNumber = myPhoneNumber;
            BaseStation = baseStation;
        }
        //撥打電話
        public abstract void Dial(int dialNumber);
    }

    /// <summary>
    /// 手機
    /// </summary>
    class Cellphone : PhoneClass
    {
        public Cellphone(int myPhoneNumber, Mediator baseStation)
            : base(myPhoneNumber, baseStation)
        {
        }

        public override void Dial(int dialNumber)
        {
            BaseStation.Connect(dialNumber);
        }
    }

    /// <summary>
    /// 座機
    /// </summary>
    class Telephone : PhoneClass
    {
        public Telephone(int myPhoneNumber, Mediator baseStation)
            : base(myPhoneNumber, baseStation)
        {
        }

        public override void Dial(int dialNumber)
        {
            BaseStation.Connect(dialNumber);
        }

    }
}
           

調用:

using System;

namespace Mediator
{
    class Program
    {
        static void Main(string[] args)
        {
            BaseStationMediator baseStation = new BaseStationMediator();
            Cellphone cellphone = new Cellphone(138, baseStation);
            Telephone telephone = new Telephone(555, baseStation);
            //添加電話到基站
            baseStation.AddPhone(cellphone);
            baseStation.AddPhone(telephone);
            //撥打号碼
            cellphone.Dial(555);
            cellphone.Dial(222);

            Console.Read();
        }
    }
}
           

結果:

C# 設計模式-中介者(Mediator)

參考資料:《設計模式-可複用面對對象軟體的基礎》

繼續閱讀