“戲”說設計模式——中介者模式
首先請出今天的主人公——“丐幫幫主”喬峰
蕭峰一生有情有義,對愛情堅貞,對國家和民族忠誠,人生經歷坎坷悲壯,其胸襟氣吞山河,他提倡人道和平,選擇為拯救世人而自我毀滅,是一個心繫蒼生、悲天憫人、思想境界超越國界和民族的悲劇英雄。
中介者模式簡介:
中介是作用於多個事物中間充當相互交流的一種媒介。在我們生活中比比皆是,如婚介所、房產中介、交換機組網、現代電子商務、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