美文网首页Java基础
[设计模式]中介者模式

[设计模式]中介者模式

作者: Merbng | 来源:发表于2020-03-19 15:23 被阅读0次

    定义

    定义了一个对象来封装一系列对象之间的交互关系,中介者使得各个对象之间不需要显式的相互引用,从而降低了耦合,而且还可以独立的改变它们之间的交互行为

    例子

    /**抽象中介角色
     * Created by merbng on 2020/3/19.
     */
    
    public abstract class WulinAlliance {
        public abstract void notice(String message, United united);
    }
    
    
    
    /**
     * 具体中介者角色: 武林盟主类
     * Created by merbng on 2020/3/19.
     */
    
    public class Champions extends WulinAlliance {
        private Wudang wudang;
        private Shaolin shaolin;
        private Emei emei;
    
        public void setShaolin(Shaolin shaolin) {
            this.shaolin = shaolin;
        }
    
        public void setEmei(Emei emei) {
            this.emei = emei;
        }
    
        public void setWudang(Wudang wudang) {
            this.wudang = wudang;
        }
    
        @Override
        public void notice(String message, United united) {
            if (united == wudang) {
                shaolin.getNotice(message);
            } else if (united == emei) {
                shaolin.getNotice(message);
            } else if (united == shaolin) {
                wudang.getNotice(message);
                emei.getNotice(message);
            }
        }
    }
    
    
    /**
     * 抽象同事角色
     * Created by merbng on 2020/3/19.
     */
    
    public abstract class United {
        protected WulinAlliance wulinAlliance;
    
        public United(WulinAlliance wulinAlliance) {
            this.wulinAlliance = wulinAlliance;
        }
    }
    
    
    
    /**具体同事类
     * Created by merbng on 2020/3/19.
     */
    
    public class Wudang extends United {
        public Wudang(WulinAlliance wulinAlliance) {
            super(wulinAlliance);
        }
    
        public void sendAlliance(String message) {
            wulinAlliance.notice(message, this);
        }
    
        public void getNotice(String message) {
            Log.e("==设计模式:中介者模式==","武当收到消息:" + message);
        }
    }
    /**具体同事类
     * Created by merbng on 2020/3/19.
     */
    
    public class Shaolin extends United {
        public Shaolin(WulinAlliance wulinAlliance) {
            super(wulinAlliance);
        }
    
        public void sendAlliance(String message) {
            wulinAlliance.notice(message, this);
        }
    
        public void getNotice(String message) {
            Log.e("==设计模式:中介者模式==","少林收到消息:" + message);
        }
    }
    /**
     * 具体同事类
     * Created by merbng on 2020/3/19.
     */
    
    public class Emei extends United {
        public Emei(WulinAlliance wulinAlliance) {
            super(wulinAlliance);
        }
    
        public void sendAlliance(String message) {
            wulinAlliance.notice(message, this);
        }
    
        public void getNotice(String message) {
            Log.e("==设计模式:中介者模式==", "峨眉收到消息:" + message);
        }
    }
    
    

    测试类

    public class MediatorModeTest extends Activity {
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
        /* 中介者模式可以拿武侠来举例,江湖中门派众多,门派之前因为想法不同会有很多的利益冲突,这样就会带来无休止的纷争。为了江湖的安宁,大家推举出了一个大家都认可的武林盟主来对江湖纷争进行调停。
    前段时间武当派和峨眉派的的弟子被大力金刚指所杀,大力金刚指是少林派的绝学,因为事情重大,而且少林派实力强大,武当派和峨眉派不能够直接去少林派去问罪,只能上报武林盟主由武林盟主出面进行调停
        * */
            Champions champions = new Champions();
            Wudang wudang = new Wudang(champions);
            Shaolin shaolin = new Shaolin(champions);
            Emei emei = new Emei(champions);
            champions.setWudang(wudang);
            champions.setShaolin(shaolin);
            champions.setEmei(emei);
            wudang.sendAlliance("武当弟子被少林大力金刚指所杀");
            emei.sendAlliance("峨眉弟子被少林大力金刚指所杀");
            shaolin.sendAlliance("少林弟子绝不会做出这种事情");
        }
    }
    
    

    输出结果:

    输出结果为:
    少林收到消息:武当弟子被少林大力金刚指所杀
    少林收到消息:峨眉弟子被少林大力金刚指所杀
    武当收到消息:少林弟子绝不会做出这种事情
    峨眉收到消息:少林弟子绝不会做出这种事情
    

    优缺点

    优点

    • 简化了对象之间的关系,将系统的各个对象之间的交互关系进行封装,将各个同事类解耦,使得系统变为松耦合
    • 提供系统的灵活性,使得各个同事对象独立而易于复用

    缺点

    • 中介者模式中,中介者角色担任了较多的责任,所以一旦这个中介者出现了问题,整个系统将会受到重大影响
    • 新增加一个同事类时,不得不去修改抽象中介类和具体中介者类,此时可以用观察者模式和状态模式来解决这个问题。

    适用场景

    • 一组定义好的对象,现在要进行复杂的交互通信
    • 想通过一个中间类来封装多个类中的行为,而不想生成太多的子类。

    参考链接:
    刘望舒-设计模式(十四)中介者模式
    设计模式之中介者模式

    相关文章

      网友评论

        本文标题:[设计模式]中介者模式

        本文链接:https://www.haomeiwen.com/subject/hollyhtx.html