using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MediatorPattern { /// /// 抽象角色(模块) /// 主要实现中介的依赖注入 /// public abstract class Role { protected AbstractMediator mediator; public Role(AbstractMediator mediator) { this.mediator = mediator; } } /// /// 购房(者)市场 /// public class HomeBuyer : Role { private readonly string name = "购房市场:"; public HomeBuyer(AbstractMediator mediator) : base(mediator) { } private static int requirement = 800;//购房需求 public void BuyHouse(int num) { string rule = mediator.GetRule(); Console.WriteLine(name + "需要买房:" + num + "套"); if (rule != "LimitBuy") { requirement += num; } else { Console.WriteLine(name + "国家实例了限购政策,不允许购买"); } } /// /// 签订购房合同 /// /// public void SignAgreement(int num) { requirement -= num; Console.WriteLine(string.Format("{0}成功购房{1}套", name, num)); } public int GetRequirement() { return requirement; } } /// /// 房地产商 /// public class Builder : Role { private readonly string name = "房地产商:"; public Builder(AbstractMediator mediator) : base(mediator) { } private static int houseNum = 1000; public void BuildHouse() { int requirement = mediator.GetBuyRequirement(); if (houseNum < requirement) { //房源不够,立马新建 int needBuild = requirement - houseNum + 100; Console.WriteLine(name + "建房:" + needBuild + "套"); houseNum += needBuild; } } public void SaleHouse(int num) { if (houseNum < num) { string rule = mediator.GetRule(); if (rule != "LimitBuild") { Console.WriteLine(name + "房源不够,正在建设中"); this.BuildHouse(); } } else { houseNum -= num; Console.WriteLine(name + "卖房:" + num + "套"); //告诉购房者签订合同 mediator.HomeBuyer.SignAgreement(num); } } public int ShowHouseNum() { return houseNum; } } /// /// 住建局 /// public class ControlCenter : Role { public ControlCenter(AbstractMediator mediator) : base(mediator) { } private readonly string name = "住建局:"; private static string rule; /// /// 当需大于供,限购 /// 当供大于需,限建 /// public void Limit() { int requirement = mediator.GetBuyRequirement(); int buildingNum = mediator.GetCurrentHouseNumber(); string strs = string.Format("{0}目前购房需求为:{1}套;现有房源:{2}套。", name,requirement, buildingNum); if (requirement > buildingNum) { Console.WriteLine(strs + "供小于需,开始实施限购政策"); rule = "LimitBuy"; } else { Console.WriteLine(strs + "供大于需,开始实施限建政策"); rule = "LimitBuild"; } } public string ShowRule() { return rule; } } /// /// 抽象中介,定义各模块依赖的功能 /// public abstract class AbstractMediator { /// /// 使用属性注入 /// 因为中介可能只需要和部分角色(模块)交互 /// public HomeBuyer HomeBuyer { get; set; } public Builder HouseBuilder { get; set; } public ControlCenter ControlCenter { get; set; } /// /// 获取购房需求 /// /// public abstract int GetBuyRequirement(); /// /// 获取房源数目 /// /// public abstract int GetCurrentHouseNumber(); /// /// 获取楼市政策 /// /// public abstract string GetRule(); } /// /// 具体中介,实现各模块依赖的功能 /// public class Mediator : AbstractMediator { public override int GetBuyRequirement() { return base.HomeBuyer.GetRequirement(); } public override int GetCurrentHouseNumber() { return base.HouseBuilder.ShowHouseNum(); } public override string GetRule() { return base.ControlCenter.ShowRule(); } } }