中介者模式是一种对象行为型设计模式。定义了一个中介性质的对象来封装一系列对象的交互,使原有的对象松耦合,可以解耦它们之间的交互。以飞机塔台为例,若没有机场塔台的存在,让各个准备降落的飞机相互之间自己交互,将会产生撞机事故。有个机场塔台的存在,让各自交互的网状关系,解耦成以机场塔台为核心的形状结构。
namespace Designmode.Mediator
{
/// <summary>
/// 飞行器抽象类
/// </summary>
public abstract class Aircraft
{
/// <summary>
/// 飞机抵达机场上空时间
/// </summary>
protected DateTime _lastAircraftTime;
/// <summary>
/// 塔台
/// </summary>
protected ControlTower _controlTower;
/// <summary>
/// 航班信息
/// </summary>
public string Info { get; set; }
/// <summary>
/// 获取飞机抵达时间
/// </summary>
/// <returns></returns>
public DateTime GetArrivalTime()
{
return this._lastAircraftTime;
}
/// <summary>
/// 设置塔台
/// </summary>
/// <param name="c">塔台</param>
public void SetControlTower(ControlTower c)
{
this._controlTower = c;
}
/// <summary>
/// 飞机执行动作
/// </summary>
/// <param name="isLand"></param>
public abstract void DoSomething(bool isLand);
}
}
namespace Designmode.Mediator
{
/// <summary>
/// 飞机控制塔台抽象类
/// </summary>
public abstract class ControlTower
{
/// <summary>
/// 等待着陆的飞机
/// </summary>
public List<Aircraft> WaitforLandAircrafts = new List<Aircraft>();
/// <summary>
/// 添加抵达的飞机
/// </summary>
/// <param name="a">飞行器</param>
public void AddAircraft(Aircraft a)
{
if (a != null && !WaitforLandAircrafts.Contains(a))
{
WaitforLandAircrafts.Add(a);
}
}
/// <summary>
/// 调度航班起飞与降落
/// </summary>
public abstract void Dispatch();
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Designmode.Mediator
{
/// <summary>
/// 上海虹桥机场控制台
/// </summary>
public class HongQiaoControlTower : ControlTower
{
/// <summary>
/// 调度飞机
/// </summary>
public override void Dispatch()
{
var aricrafts = WaitforLandAircrafts.OrderBy(s=>s.GetArrivalTime()).ToList();
aricrafts[0].DoSomething(true);
if (aricrafts.Count() > 1)
{
for (int i = 1; i < aricrafts.Count(); i++)
{
aricrafts[i].DoSomething(false);
}
}
}
}
}
namespace Designmode.Mediator
{
/// <summary>
/// 北京到上海的飞机
/// </summary>
public class BeiJingToShangHaiAircraft : Aircraft
{
/// <summary>
/// 构造一个武汉到上海的航班飞机
/// </summary>
/// <param name="t"></param>
public BeiJingToShangHaiAircraft(DateTime t)
{
_lastAircraftTime = t;
Info = "北京 TO 上海的航班";
}
/// <summary>
/// 飞机执行动作
/// </summary>
/// <param name="isLand">是否可以降落</param>
public override void DoSomething(bool isLand)
{
if (isLand)
{
Console.WriteLine("北京 TO 上海的航班... 准备降落");
}
else
{
Console.WriteLine("北京 TO 上海的航班... 等待降落");
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Designmode.Mediator
{
/// <summary>
/// 武汉到上海的飞机
/// </summary>
public class WuHanToShangHaiAircraft:Aircraft
{
/// <summary>
/// 构造一个武汉到上海的航班飞机
/// </summary>
/// <param name="t"></param>
public WuHanToShangHaiAircraft(DateTime t)
{
_lastAircraftTime = t;
Info = "武汉 TO 上海的航班";
}
/// <summary>
/// 飞机执行动作
/// </summary>
/// <param name="isLand">是否可以降落</param>
public override void DoSomething(bool isLand)
{
if (isLand)
{
Console.WriteLine("武汉 TO 上海的航班 准备降落");
}
else
{
Console.WriteLine("武汉 TO 上海的航班 等待降落");
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Designmode.Mediator;
namespace Designmode
{
class Program
{
static void Main(string[] args)
{
#region 中介者模式
ControlTower hongQiaoControlTower = new HongQiaoControlTower();
BeiJingToShangHaiAircraft beiJingToShangHaiAircraft = new BeiJingToShangHaiAircraft(DateTime.Now);
beiJingToShangHaiAircraft.SetControlTower(hongQiaoControlTower);
hongQiaoControlTower.AddAircraft(beiJingToShangHaiAircraft);
WuHanToShangHaiAircraft wuHanToShangHaiAircraft = new WuHanToShangHaiAircraft(DateTime.Now);
wuHanToShangHaiAircraft.SetControlTower(hongQiaoControlTower);
hongQiaoControlTower.AddAircraft(wuHanToShangHaiAircraft);
hongQiaoControlTower.Dispatch();
#endregion
}
}
}