(十九)中介者模式-代码实现

介绍

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

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

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

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

代码:

//定义模块抽象类

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

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

时间: 2024-10-14 11:05:52

(十九)中介者模式-代码实现的相关文章

设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)

设计模式 ( 十五 ) 中介者模式Mediator(对象行为型) 1.概述 在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责,即将行为分布到各个对象中. 对于一个模块或者系统,可能由很多对象构成,而且这些对象之间可能存在相互的引用,在最坏的情况下,每一个对象都知道其他所有的对象,这无疑复杂化了对象之间的联系.虽然将一个系统分割成许多对象通常可以增强可复用性,但是对象间相互连接的激增又会降低其可复用性,大量的相互连接使得一个对象似乎不太可能

Java设计模式菜鸟系列(二十二)中介者模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40027109 中介者模式(Mediator):主要用来降低类与类之间的耦合的,因为如果类与类之间有依赖关系的话,不利于功能的拓展和维护,因为只要修改一个对象,其它关联的对象都得进行修改. 一.uml建模: 二.代码实现 /** * 中介者模式(Mediator):主要用来降低类与类之间的耦合的,因为如果类与类之间有依赖关系的话, * * 不利于功能的拓展和维护,因为只要修改一个对象,其它

javascript设计模式学习之十五——中介者模式

一.中介者模式的定义和应用场景 中介者模式的作用在于解除对象之间的紧耦合关系,增加一个中介者之后,所有对象都通过中介者来通信,而不是互相引用,当一个对象发生变化的时候,仅需要通知中介者即可.从而将网状的多对多关系转换为了简单的一对多关系. 二.

(十五)职责链模式-代码实现

介绍 概念:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 应用场景:经常增加处理场景的业务,比如处理零食商品的类,不断有新增的零食,就需要不断增加处理零食的方法,耦合度太高.为了降低耦合度使用职责链模式. 好处:扩展灵活.结构清晰. 代码: //处理器的接口定义 package note.com.chain; public interface Handler { public void doHan

(十五)责任链模式-代码实现

介绍 概念:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 应用场景:经常增加处理场景的业务,比如处理零食商品的类,不断有新增的零食,就需要不断增加处理零食的方法,耦合度太高.为了降低耦合度使用职责链模式. 好处:扩展灵活.结构清晰. 代码: //处理器接口定义 package note.com.chain; public abstract class Handler { public String

设计模式之十九:命令模式(Command)

命令模式:将一个请求封装成一个对象,从而允许用不同的请求参数化客户,对请求进行排序或记录日志,并且支持撤销操作. UML图: 主要包括: Command:声明了一个操作的接口 ConcreteCommand:绑定了一个Receiver和一个行为,通过相关联的Receiver对象实现了了execute方法. Client:创建一个ConcreteCommand对象并且设置了它的Receiver. invoker:要求命令执行请求. Receiver:知道如何实施与执行请求相关的操作. 命令模式的核

设计模式(十九)状态模式(State)-行为型

状态模式(State)-行为型 在职责链模式中,将条件语句改成多个职责类进行处理,如果不是自己处理,则自动转到下一个职责类,如果在转给下一个职责类进行处理前,需要修改当前的状态,此时就需要用到状态模式. 引例:电梯的运行过程,各种状态切换. 实现原理图 状态模式实现原理图 状态模式就是根据对象的状态不同,作出不同的行为.状态模式使代码中复杂而庸常的逻辑判断语句问题得到了解决,而且具体状态角色将具体状态和他对应的行为封装了起来,这使得增加一种新的状态变得十分简单.状态模式主要由三部分组成,抽象状态

设计模式C++实现十九:命令模式

命令模式(Command):将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作. 命令模式的优点: 第一.能较容易的设计一个命令队列. 第二.在需要的情况下,可用较容易地将命令计入日志. 第三.允许接受请求的一方决定是否需要否决请求. 第四.可用容易地实现对请求的撤销和重做. 第五.由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易. 关键优点:把请求一个操作的对象与知道怎么执行一个操作的对象分割开. 如果不清楚一个

C#之三十九 抽象工厂模式

在软件系统中,经常面临着"一系列相互依赖的对象"的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作.如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种"封装机制"来避免客户程序和这种"多系列具体对象创建工作"的紧耦合?这就是我们要说的抽象工厂模式. 重点: ?      抽象工厂模式概念 ?      抽象工厂模式的模型图 ?      抽象工厂模式访问多种数据库 预习功课: ?      什么是抽象工厂模式 ?