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来控制,使三个模块更专心于自己的功能。

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

  • 相关阅读:
    Linux(centos)系统各个目录的作用详解
    java.util.ConcurrentModificationException异常处理
    欧几里得算法
    Google数据中心B4网络具体实现
    网络虚拟化
    SDN/NFV若干问题
    opendaylight的Beryllium安装
    解读SDN的东西、南北向接口
    SFC中的故障管理
    SFC中的问题描述
  • 原文地址:https://www.cnblogs.com/qinggege/p/5246896.html
Copyright © 2011-2022 走看看