基于C#的设计模式学习之中介这模式

        中介者模式是一种对象行为型设计模式。定义了一个中介性质的对象来封装一系列对象的交互,使原有的对象松耦合,可以解耦它们之间的交互。以飞机塔台为例,若没有机场塔台的存在,让各个准备降落的飞机相互之间自己交互,将会产生撞机事故。有个机场塔台的存在,让各自交互的网状关系,解耦成以机场塔台为核心的形状结构。

 

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值