“戏”说设计模式——中介者模式

首先请出今天的主人公——“丐帮帮主”乔峰

 萧峰一生有情有义,对爱情坚贞,对国家和民族忠诚,人生经历坎坷悲壮,其胸襟气吞山河,他提倡人道和平,选择为拯救世人而自我毁灭,是一个心系苍生、悲天悯人、思想境界超越国界和民族的悲剧英雄。

中介者模式简介:

中介是作用于多个事物中间充当相互交流的一种媒介。在我们生活中比比皆是,如婚介所、房产中介、交换机组网、现代电子商务、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

 

©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页