1. 程式人生 > >“戲”說設計模式——中介者模式

“戲”說設計模式——中介者模式

首先請出今天的主人公——“丐幫幫主”喬峰

 蕭峰一生有情有義,對愛情堅貞,對國家和民族忠誠,人生經歷坎坷悲壯,其胸襟氣吞山河,他提倡人道和平,選擇為拯救世人而自我毀滅,是一個心繫蒼生、悲天憫人、思想境界超越國界和民族的悲劇英雄。

中介者模式簡介:

中介是作用於多個事物中間充當相互交流的一種媒介。在我們生活中比比皆是,如婚介所、房產中介、交換機組網、現代電子商務、C2C購物平臺、手機、即時通軟體。

廣為人們熟知的QQ、微信、瓜子二手車、天貓都是充當媒介的。可以說現在的網際網路都在為人與人之間充當媒介作用,我們也受益於這種簡便快捷的媒介。

在《天龍八部》中有一場“武林大會”的情節,武林大會是中原武林的巔峰之戰,獲得第一名即可獲得“武林盟主”稱呼,便可稱霸武林。於是一直想光復大燕的慕容復想通過這次大會稱霸武林,到時候名聲大振便可收兵買馬光復大燕。被人控制的丐幫幫主“鐵頭人”遊坦之也要提高名望。還有“星宿老怪”丁春秋也想稱霸中原,練成化功大法。而我們的主人公喬峰想通過這些人得知自己的殺父母之人,報仇心切。於是大家齊聚嵩山少林寺。

少林寺為了開武林大會,邀請了天下豪傑,大家紛紛趕來,於是我們將少林比作“媒介

我們有請大俠登場

public class DaXia {
    private String name;//大俠姓名
    private DaXia othername;//另一位大俠姓名

    public DaXia(String name) {
        this.name = name;
    }

    public String getName() {
        return name;//表面是哪位大俠
    }

    public void invite(DaXia othername){//大俠為了挑戰對方,故邀請對方
        this.othername = othername;//注入對方的姓名,找到對方
    }

    public void talk(String ShuXin){//發出挑戰,書信來往,只能收信
        othername.listen(ShuXin);
    }

    public void listen(String ShuXin){//收到對方回信
        System.out.println(othername.getName() + "在信中寫道" +"【"+ShuXin+"】");
    }
}

 少林寺充當大會場地,溝通各位大俠。

public class ShaoLinSi {//少林寺

    public static void main(String[] args) {
        DaXia MuRongFu = new DaXia("慕容復");
        DaXia QiaoFeng = new DaXia("喬峰");

        MuRongFu.invite(QiaoFeng);
        QiaoFeng.invite(MuRongFu);
        MuRongFu.talk("我在少林寺要挑戰你,我要當武林盟主");
        QiaoFeng.talk("大丈夫敢作敢當,你放馬過來吧!");

    }
}

結果是

 我們在例項中看到,慕容復想要挑戰喬峰,當武林盟主,得先給喬峰寫信,然後喬峰迴信,倆個人才能在少林寺約戰。

那麼如果很多人都要挑戰喬峰,那喬峰是不很麻煩,他的回多少封信呢?有沒有更好的辦法呢?

由此我們引入少林寺,讓少林寺充當媒介,邀請天下豪傑請來挑戰,然後在單獨邀請喬峰。

 

 於是我們改變一下

 

public class DaXia {
    private String name;//大俠姓名
    private ShaoLinSi shaoLinSi;//另一位大俠姓名

    public String getName() {
        return name;//表明是哪位大俠
    }

    public DaXia(String name) {
        this.name = name;
    }

    public void enter(ShaoLinSi shaoLinSi){//大俠進入少林寺挑戰名單
        shaoLinSi.invite(this);
        this.shaoLinSi = shaoLinSi;
    }

    public void talk(String ShuXin){//發出挑戰,書信來往,只能收信
        shaoLinSi.sendShuXin(this,ShuXin);
    }

    public void listen(DaXia formDaXia,String ShuXin){//收到對方回信
        System.out.println(formDaXia.getName() + "在信中寫道" +"【"+ShuXin+"】");
    }
}

少林寺是溝通各位大俠的“媒介

public class ShaoLinSi {//少林寺

    private String name;

    public ShaoLinSi(String name) {
        this.name = name;
    }

    ArrayList<DaXia> daXias = new ArrayList<>();//眾大俠們

    public void invite(DaXia daXia) {//邀請各位大俠
        this.daXias.add(daXia);
        System.out.println(name+"“武林大會”邀請【"+ daXia.getName()+"】前來挑戰");
    }

    public void sendShuXin(DaXia fromDaxia,String ShuXin){//少林寺釋出公告
        daXias.stream().filter(daXia -> !daXia.equals(fromDaxia))
                .forEach(toDaXia -> toDaXia.listen(fromDaxia,ShuXin));
            
    }

    public static void main(String[] args) {

        ShaoLinSi shaoLinSi = new ShaoLinSi("少林寺");

        DaXia QiaoFeng = new DaXia("喬峰");
        DaXia MuRongFu = new DaXia("慕容復");
        QiaoFeng.enter(shaoLinSi);
        MuRongFu.enter(shaoLinSi);
        MuRongFu.talk("我要挑戰你,我要當武林盟主!");
        QiaoFeng.talk("大丈夫敢作敢當,放馬過來!");
    }
}

中介者模式就像資料結構中的拓撲法則一樣,在程式開發的過程中也尤為重要,物件和物件如果引用的非常之多就會導致java虛擬機器的卡頓,獨立性和可維護性大大降低,這不利於我們開發者的維護和擴充,於是我們藉助“媒介”這一概念來解決問題,使程式碼符合高內聚低耦合的設計標準。

在這裡要補充一個知識點:迪米特法則

一個物件應當對其他物件有儘可能少的瞭解,不和陌生人說話,就是減少物件之間的耦合(聯絡)。

現在微服務分散式框架大行其道(Dubbo & Spring Cloud),其中所涉及的就是中介者模式,為各種分散式服務提供註冊發現服務。

加個關注吧,下次接著看!謝謝!!!

https://blog.csdn.net/wfy2695766757