用一個中介對象來封裝一系列對象的互動,使得各對象不需要顯示地互相引用,進而耦合松散。
主要組成:
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();
}
}
}
結果:
參考資料:《設計模式-可複用面對對象軟體的基礎》