zoukankan      html  css  js  c++  java
  • (十九)中介者模式-代码实现

    介绍

    概念:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

    应用场景:不同功能的模块之间调用关系复杂,耦合度高,不利于修改时使用。

    好处:降低耦合,模块独立。

    坏处:中介者业务复杂,不易维护。

    代码:

    //定义模块抽象类

    package note.com.mediator;
    
    public abstract class Element {
        public Mediator mediator = null;
        
        public abstract void good();
        
        public abstract void bad();
    
        public Mediator getMediator() {
            return mediator;
        }
    
        public void setMediator(Mediator mediator) {
            this.mediator = mediator;
        }
        
        public abstract void changeGood();
        
        public abstract void changeBad();
        
        
    
    }

    //模块具体实现

    package note.com.mediator;
    
    /**
     * 元素-部队
     * @author lxz
     *
     */
    public class Army extends Element{
    
        @Override
        public void good() {
            System.out.println("部队强大");
            
        }
    
        @Override
        public void bad() {
            System.out.println("部队弱小");
        }
    
        @Override
        public void changeGood() {
            getMediator().change(Mediator.ARMY, Mediator.GOOD);
        }
        
        @Override
        public void changeBad() {
            getMediator().change(Mediator.ARMY, Mediator.BAD);
        }
    
    }
    package note.com.mediator;
    
    /**
     * 元素-政府
     * @author lxz
     *
     */
    
    
    public class Goverment extends Element{
    
        @Override
        public void good() {
            System.out.println("政府有钱");
        }
    
        @Override
        public void bad() {
            System.out.println("政府没钱");
        }
        
        @Override
        public void changeGood() {
            good();
            getMediator().change(Mediator.GOVERMENT, Mediator.GOOD);
        }
        
        @Override
        public void changeBad() {
            bad();
            getMediator().change(Mediator.GOVERMENT, Mediator.BAD);
        }
    
    }
    package note.com.mediator;
    
    
    /**
     * 元素-人民
     * @author lxz
     *
     */
    public class People  extends Element{
    
        @Override
        public void good() {
            System.out.println("人民幸福");
        }
    
        @Override
        public void bad() {
            System.out.println("人民不幸福");
        }
        
        @Override
        public void changeGood() {
            good();
            getMediator().change(Mediator.PEOPLE, Mediator.GOOD);
        }
        
        @Override
        public void changeBad() {
            bad();
            getMediator().change(Mediator.PEOPLE, Mediator.BAD);
        }
    
    }

    //中介者,定义模块之间的调用

    package note.com.mediator;
    
    /**
     * 协调者
     * @author lxz
     *
     */
    public class Mediator{
        public static final String ARMY = "Army";
        public static final String GOVERMENT = "Goverment";
        public static final String PEOPLE = "People";
        public static final String GOOD = "good";
        public static final String BAD = "bad";
        
        public Element a = null;
        public Element g = null;
        public Element p = null;
        
        public Mediator(Army a,Goverment g,People p){
            this.a = a;
            this.g = g;
            this.p = p;
        }
        
        public void change(String label,String state){
            
            if(ARMY.equals(label)){
                if(GOOD.equals(state)){
                    g.good();
                    p.good();
                }else if(BAD.equals(state)){
                    g.bad();
                    p.bad();
                }
            }else if(GOVERMENT.equals(label)){
                if(GOOD.equals(state)){
                    a.good();
                    p.good();
                }else if(BAD.equals(state)){
                    a.bad();
                    p.bad();
                }
                
            }else if(PEOPLE.equals(label)){
                if(GOOD.equals(state)){
                    a.good();
                    g.good();
                }else if(BAD.equals(state)){
                    a.bad();
                    g.bad();
                }
            }
        }
    
        public Element getA() {
            return a;
        }
    
        public void setA(Element a) {
            this.a = a;
        }
    
        public Element getG() {
            return g;
        }
    
        public void setG(Element g) {
            this.g = g;
        }
    
        public Element getP() {
            return p;
        }
    
        public void setP(Element p) {
            this.p = p;
        }
    
        
    
    }

    //测试类

    package note.com.mediator;
    
    public class MediatorTest {
        public static void main(String[] args) {
            //三个元素,分别有不同的功能,但又相互有影响
            Army a = new Army();
            Goverment g = new Goverment();
            People p = new People();
            //中间调解者
            Mediator mediator = new Mediator(a,g,p);
            a.setMediator(mediator);
            g.setMediator(mediator);
            p.setMediator(mediator);
            a.changeBad();//军队变化
            System.out.println("====");
            g.changeBad();//政府变化
            System.out.println("====");
            p.changeGood();//人民变化
        }
    }

    //结果

    政府没钱
    人民不幸福
    ====
    政府没钱
    部队弱小
    人民不幸福
    ====
    人民幸福
    部队强大
    政府有钱

    由此可以看出例子中的三个模块之间的调用关系由Mediator来控制,使三个模块更专心于自己的功能。

    注意:小心设计成死循环。

  • 相关阅读:
    Laya页面嵌套和Scene.destory导致的Bug
    Laya的滚动容器Panel+HBox
    Laya的对象唯一标识
    Android自带的TTS功能
    一步一步学android之控件篇——ListView基本使用
    android surfaceView 的简单使用 画图,拖动效果
    Android 数据分析系列一:sharedPreferences
    Android Service总结
    android中碰撞屏幕边界反弹问题
    Android开发:setAlpha()方法和常用RGB颜色表----颜色, r g b分量数值(int), 16进制表示 一一对应
  • 原文地址:https://www.cnblogs.com/qinggege/p/5246896.html
Copyright © 2011-2022 走看看