首先请出今天的主人公——“丐帮帮主”乔峰
萧峰一生有情有义,对爱情坚贞,对国家和民族忠诚,人生经历坎坷悲壮,其胸襟气吞山河,他提倡人道和平,选择为拯救世人而自我毁灭,是一个心系苍生、悲天悯人、思想境界超越国界和民族的悲剧英雄。
中介者模式简介:
中介是作用于多个事物中间充当相互交流的一种媒介。在我们生活中比比皆是,如婚介所、房产中介、交换机组网、现代电子商务、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),其中所涉及的就是中介者模式,为各种分布式服务提供注册发现服务。