意图 适用性 结构 实现 效果 参考 意图用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。适用性一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解 ...
意图
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。
适用性
- 一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
- 一个对象引用其他很多对象并且之间
- 想定制一个分布在多个类中的行为,而又不想生成太多子类。
结构
实现
在未来的智能家居中,家里的各种电器相互关联,假设这样三种电器:闹钟,日历和咖啡壶。现在有这样两个任务:
- 当按下闹钟的“延迟”按钮(过5分钟后再次响铃)后,日历检查今天是否是星期日,如果不是,则咖啡壶开始准备咖啡。
- 当关闭日历,咖啡壶和闹钟也一同关闭。
同事类,每一个同事都知道他的中介者,当它需要与其他同事交流时,它只需通知中介者。
public abstract class Colleague { protected string _type; protected Mediator _theMediator; public string Type { get { return _type; } } public Mediator TheMediator { get { return _theMediator; } set { _theMediator = value; } } }
具体同事
public class Alarm : Colleague { public Alarm() { _type = "Alarm"; } public void AlarmLater() { Console.WriteLine("Alarm 5min later"); _theMediator.Notify(this); } public void PowerOff() { Console.WriteLine("Alarm PowerOff"); } } public class CoffeePot : Colleague { public CoffeePot() { _type = "CoffeePot"; } public void PrepareCoffee() { Console.WriteLine("Start preparing coffee"); } public void PowerOff() { Console.WriteLine("CoffeePot PowerOff"); } } public class Calendar : Colleague { public Calendar() { _type = "Calendar"; } public DayOfWeek GetDayOfWeek() { return DateTime.Today.DayOfWeek; } public void PowerOff() { Console.WriteLine("Calendar PowerOff"); _theMediator.Notify(this); } }
中介者定义一个用于与各同事通信的接口
public class Mediator { public virtual void Notify(Colleague colleague) { } }
具体中介者了解和维护各个同事,并协调各同事以实现协作行为。
public class FutureHouse : Mediator { private Alarm _alarm; private CoffeePot _coffeePot; private Calendar _calendar; public Calendar HouseCalendar { get { return _calendar; } set { _calendar = value; } } public CoffeePot HouseCoffeePot { get { return _coffeePot; } set { _coffeePot = value; } } public Alarm HouseAlarm { get { return _alarm; } set { _alarm = value; } } private void WeekUp() { if (HouseCalendar.GetDayOfWeek()!=DayOfWeek.Sunday) { HouseCoffeePot.PrepareCoffee(); } } private void PowerOff() { HouseCoffeePot.PowerOff(); HouseAlarm.PowerOff(); } public override void Notify(Colleague colleague) { if (colleague.Type == "Alarm") { WeekUp(); } else if (colleague.Type == "Calendar") { PowerOff(); } } }
使用
class Program { static void Main(string[] args) { var calendar = new Calendar(); var coffeePot = new CoffeePot(); var alarm = new Alarm(); var house = new FutureHouse(); calendar.TheMediator = house; alarm.TheMediator = house; coffeePot.TheMediator = house; house.HouseCalendar = calendar; house.HouseAlarm = alarm; house.HouseCoffeePot = coffeePot; alarm.AlarmLater(); calendar.PowerOff(); Console.ReadKey(); } }
运行结果
- 周日
原标题:设计模式C#实现(十六)——中介者模式
关键词:C#
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。