系列對(duì)象,依賴交互喂走,『中介者模式』來(lái)幫忙

目錄:設(shè)計(jì)模式之小試牛刀
源碼路徑:Github-Design Pattern


定義:(Mediator Pattern)

用一個(gè)中介對(duì)象封裝一系列的對(duì)象交互,中介者使各對(duì)象不需要顯示地相互作用谋作,從而使耦合松散芋肠,而且可以獨(dú)立地改變它們之間的交互。

類圖:

中介模式類圖

啟示:

最近兩年瓷们,樓市瘋狂业栅,房?jī)r(jià)漲的離譜。為了預(yù)防樓市泡沫谬晕,中央出臺(tái)一項(xiàng)項(xiàng)政策進(jìn)行調(diào)控碘裕。在這樣一個(gè)現(xiàn)實(shí)場(chǎng)景中,共有三個(gè)角色攒钳,買房者帮孔,房地產(chǎn)商,住建局不撑。
買房者關(guān)注房地廠商的樓盤(pán)及房?jī)r(jià)文兢,決定是否買房;
房地廠商關(guān)注買方市場(chǎng)焕檬,是否需要新建樓盤(pán)姆坚;
住建局就來(lái)協(xié)調(diào)買方與賣方市場(chǎng),限購(gòu)限建实愚。
三個(gè)角色相互依賴兼呵,相互交互兔辅。耦合性比較緊,如何來(lái)解耦呢击喂?中介者來(lái)幫忙维苔。
中介是誰(shuí)呢?就像你去買房懂昂,你肯定找中介啊介时,中介無(wú)所不知,他們即知道房地廠商有哪些樓盤(pán)凌彬,又了解買房市場(chǎng)的需求沸柔,同時(shí)也很熟悉國(guó)家的樓市政策。

代碼:

/// <summary>
    /// 抽象角色(模塊)
    /// 主要實(shí)現(xiàn)中介的依賴注入
    /// </summary>
    public abstract class Role
    {
        protected AbstractMediator mediator;

        public Role(AbstractMediator mediator)
        {
            this.mediator = mediator;
        }
    }
 /// <summary>
    /// 購(gòu)房(者)市場(chǎng)
    /// </summary>
    public class HomeBuyer : Role
    {
        private readonly string name = "購(gòu)房市場(chǎng):";
        public HomeBuyer(AbstractMediator mediator)
            : base(mediator)
        {

        }
        private static int requirement = 800;//購(gòu)房需求

        public void BuyHouse(int num)
        {
            string rule = mediator.GetRule();

            Console.WriteLine(name + "需要買房:" + num + "套");

            if (rule != "LimitBuy")
            {
                requirement += num;
            }
            else
            {
                Console.WriteLine(name + "國(guó)家實(shí)例了限購(gòu)政策饿序,不允許購(gòu)買");
            }
        }

        /// <summary>
        /// 簽訂購(gòu)房合同
        /// </summary>
        /// <param name="num"></param>
        public void SignAgreement(int num)
        {
            requirement -= num;
            Console.WriteLine(string.Format("{0}成功購(gòu)房{1}套", name, num));
        }

        public int GetRequirement()
        {
            return requirement;
        }
    }
 /// <summary>
    /// 房地產(chǎn)商
    /// </summary>
    public class Builder : Role
    {
        private readonly string name = "房地產(chǎn)商:";
        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 + "房源不夠,正在建設(shè)中");
                    this.BuildHouse();
                }
            }
            else
            {
                houseNum -= num;
                Console.WriteLine(name + "賣房:" + num + "套");
                //告訴購(gòu)房者簽訂合同
                mediator.HomeBuyer.SignAgreement(num);
            }
        }

        public int ShowHouseNum()
        {
            return houseNum;
        }
    }
   /// <summary>
    /// 住建局
    /// </summary>
    public class ControlCenter : Role
    {
        public ControlCenter(AbstractMediator mediator)
            : base(mediator)
        {

        }
        private readonly string name = "住建局:";
        private static string rule;

        /// <summary>
        /// 當(dāng)需大于供原探,限購(gòu)
        /// 當(dāng)供大于需乱凿,限建
        /// </summary>
        public void Limit()
        {
            int requirement = mediator.GetBuyRequirement();
            int buildingNum = mediator.GetCurrentHouseNumber();

            string strs = string.Format("{0}目前購(gòu)房需求為:{1}套;現(xiàn)有房源:{2}套。", name,requirement, buildingNum);

            if (requirement > buildingNum)
            {
                Console.WriteLine(strs + "供小于需咽弦,開(kāi)始實(shí)施限購(gòu)政策");
                rule = "LimitBuy";
            }
            else
            {
                Console.WriteLine(strs + "供大于需徒蟆,開(kāi)始實(shí)施限建政策");
                rule = "LimitBuild";
            }
        }

        public string ShowRule()
        {
            return rule;
        }
/// <summary>
    /// 抽象中介,定義各模塊依賴的功能
    /// </summary>
    public abstract class AbstractMediator
    {
        /// <summary>
        /// 使用屬性注入
        /// 因?yàn)橹薪榭赡苤恍枰筒糠纸巧K)交互
        /// </summary>
        public HomeBuyer HomeBuyer { get; set; }
        public Builder HouseBuilder { get; set; }
        public ControlCenter ControlCenter { get; set; }

        /// <summary>
        /// 獲取購(gòu)房需求
        /// </summary>
        /// <returns></returns>
        public abstract int GetBuyRequirement();

        /// <summary>
        /// 獲取房源數(shù)目
        /// </summary>
        /// <returns></returns>
        public abstract int GetCurrentHouseNumber();

        /// <summary>
        /// 獲取樓市政策
        /// </summary>
        /// <returns></returns>
        public abstract string GetRule();

    }

    /// <summary>
    /// 具體中介型型,實(shí)現(xiàn)各模塊依賴的功能
    /// </summary>
    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();
        }
    }

class Program
    {
        static void Main(string[] args)
        {
            AbstractMediator mediator = new Mediator();

            //聲明參與的角色
            HomeBuyer buyer = new HomeBuyer(mediator);
            Builder build = new Builder(mediator);
            ControlCenter center = new ControlCenter(mediator);

            //將需要的角色注入到中介
            mediator.HouseBuilder = build;
            mediator.HomeBuyer = buyer;
            mediator.ControlCenter = center;

            int initRequirement = mediator.GetBuyRequirement();
            int initHousenum = mediator.GetCurrentHouseNumber();

            Console.WriteLine(string.Format("目前購(gòu)房需求為:{0}套;現(xiàn)有房源:{1}套段审。", initRequirement, initHousenum));

            //買房300套
            buyer.BuyHouse(300);
            
            build.SaleHouse(300);            

            //國(guó)家住建局,考察市場(chǎng)
            center.Limit();

            //再買房1000套
            buyer.BuyHouse(1000);

            Console.ReadLine();
        }
    }

運(yùn)行結(jié)果

參與角色:

● Mediator 抽象中介者角色
抽象中介者角色定義統(tǒng)一的接口闹蒜,用于各同事角色之間的通信寺枉。
● Concrete Mediator 具體中介者角色
具體中介者角色通過(guò)協(xié)調(diào)各同事角色實(shí)現(xiàn)協(xié)作行為,因此它必須依賴于各個(gè)同事角色绷落。
● Colleague 同事角色
每一個(gè)同事角色都知道中介者角色姥闪,而且與其他的同事角色通信的時(shí)候,一定要通過(guò)中介者角色協(xié)作砌烁。每個(gè)同事類的行為分為兩種:一種是同事本身的行為筐喳,比如改變對(duì)象本身的狀態(tài),處理自己的行為等函喉,這種行為叫做自發(fā)行為(Self-Method)避归,與其他的同事類或中介者沒(méi)有任何的依賴;第二種是必須依賴中介者才能完成的行為管呵,叫做依賴方法(Dep-Method)梳毙。

優(yōu)缺點(diǎn):

優(yōu)點(diǎn):中介者模式的優(yōu)點(diǎn)就是減少類間的依賴,把原有的一對(duì)多的依賴變成了一對(duì)一的依賴捐下,同事類只依賴中介者顿天,減少了依賴堂氯,當(dāng)然同時(shí)也降低了類間的耦合
缺點(diǎn):中介者模式的缺點(diǎn)就是中介者會(huì)膨脹得很大,而且邏輯復(fù)雜牌废,原本N個(gè)對(duì)象直接的相互依賴關(guān)系轉(zhuǎn)換為中介者和同事類的依賴關(guān)系,同事類越多啤握,中介者的邏輯就越復(fù)雜鸟缕。

應(yīng)用場(chǎng)景:

當(dāng)類圖中出現(xiàn)了蜘蛛網(wǎng)狀結(jié)構(gòu)時(shí)一定要考慮使用中介者模式,這有利于把蜘蛛網(wǎng)梳理為星型結(jié)構(gòu)排抬,使原本復(fù)雜混亂的關(guān)系變得清晰簡(jiǎn)單懂从。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蹲蒲,隨后出現(xiàn)的幾起案子番甩,更是在濱河造成了極大的恐慌,老刑警劉巖届搁,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缘薛,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡卡睦,警方通過(guò)查閱死者的電腦和手機(jī)宴胧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)表锻,“玉大人恕齐,你說(shuō)我怎么就攤上這事∷惭罚” “怎么了显歧?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)确镊。 經(jīng)常有香客問(wèn)我士骤,道長(zhǎng),這世上最難降的妖魔是什么骚腥? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任敦间,我火速辦了婚禮,結(jié)果婚禮上束铭,老公的妹妹穿的比我還像新娘廓块。我一直安慰自己,他們只是感情好契沫,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布带猴。 她就那樣靜靜地躺著,像睡著了一般懈万。 火紅的嫁衣襯著肌膚如雪拴清。 梳的紋絲不亂的頭發(fā)上靶病,一...
    開(kāi)封第一講書(shū)人閱讀 50,050評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音口予,去河邊找鬼娄周。 笑死,一個(gè)胖子當(dāng)著我的面吹牛沪停,可吹牛的內(nèi)容都是我干的煤辨。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼木张,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼众辨!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起舷礼,我...
    開(kāi)封第一講書(shū)人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鹃彻,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后妻献,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蛛株,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年旋奢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了泳挥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡至朗,死狀恐怖屉符,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锹引,我是刑警寧澤矗钟,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站嫌变,受9級(jí)特大地震影響吨艇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜腾啥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一东涡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧倘待,春花似錦疮跑、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至啊奄,卻和暖如春渐苏,著一層夾襖步出監(jiān)牢的瞬間掀潮,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工琼富, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留仪吧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓鞠眉,卻偏偏與公主長(zhǎng)得像邑商,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子凡蚜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容