Java设计模式--调停者模式Mediator

来源:互联网 发布:云计算logo 编辑:程序博客网 时间:2024/05/16 07:22

调停者模式

场景:

一个系统内部通过许多的类互相之间相互调用来完成一系列的功能,这个系统内部的每个类都会存在至少一次的调用与被调用,多者数不胜数,这种情况下,一旦某个类发生问题,进行修改,无疑会影响到所有调用它的类,甚至它调用的类,可见这种情况下,类与类之间的耦合性极高。


应用:

调停者犹如第三方中介一般,将所有的类与类之间的引用都导向调停者类,所有类的请求,一致发向调停者,由调停者再发向目标类,这样原本复杂的网状的类关系,变成了简单的星型类关系,调停者类位于核心,所有其他类位于外围,指向调停者。如此这般,类与类之间的直接调用耦合被解除(通过统一的第三方来发起调用),某个类发生问题,发生修改,也只会影响调停者,而不会直接影响到简介发起调用的那些类。


调停者模式和单例模式相似都是几种职责,但是调停者模式是针对一组特殊的对象,而不是系统全部的对象。

调停者模式的意图是定义一个对象,封装一组对象的交互,从而降低对象间的耦合度,避免了对象间的显式引用,并且可以独立改变对象的行为。


package website.dengta.mediator;/** * 调停者接口,相当于是中介 */public interface Mediator {    void Change(String message, Person one, String name);}

package website.dengta.mediator;/** * @author www.dengta.website * @date 2017-10-25 23:17 */public class TrueMediator implements Mediator {    @Override    public void Change(String message, Person one, String name) {        System.out.println("经理收到"+name+"的需求:"+message);        System.out.println("经理将"+name+"的需求发送给了目标职员One");        one.calledByMediator(message,name);    }}

package website.dengta.mediator;/** * @author www.dengta.website * @date 2017-10-25 23:12 */public abstract class Person {    String name;    private Mediator mediator;//请求中介者    public Person(String name, Mediator mediator) {        this.name = name;        this.mediator = mediator;    }    //被调停者调用的方法    public void calledByMediator(String message,String nname){        System.out.println(name+"接收到来自"+nname+"的需求:"+message);    }    //调用调停者    public void call(String message, Person one, String nname){        System.out.println(nname+"发起了需求:"+message);        mediator.Change(message,one,name);    }}

package website.dengta.mediator;/** * @author www.dengta.website * @date 2017-10-25 23:22 */public class TruePersonOne extends Person {    public TruePersonOne(String name, Mediator mediator) {        super(name, mediator);    }}

package website.dengta.mediator;/** * @author www.dengta.website * @date 2017-10-25 23:23 */public class TruePersonTwo extends Person {    public TruePersonTwo(String name, Mediator mediator) {        super(name, mediator);    }}

package website.dengta.mediator;/** * @author www.dengta.website * @date 2017-10-25 23:23 */public class TestMediator {    public static void main(String[] args) {        //分配职员和经理        Mediator jingli = new TrueMediator();        TruePersonOne one = new TruePersonOne("职员One",jingli);        TruePersonTwo two = new TruePersonTwo("职员Two",jingli);        //职员One的需求        String messageOne = "这些代码应该由Two来码。";        one.call(messageOne,two,two.name);        //职员Two的请求        String messageTwo = "这不是我负责的";        two.call(messageTwo,one,one.name);    }}

最后打印:

职员Two发起了需求:这些代码应该由Two来码。经理收到职员One的需求:这些代码应该由Two来码。经理将职员One的需求发送给了目标职员One职员Two接收到来自职员One的需求:这些代码应该由Two来码。职员One发起了需求:这不是我负责的经理收到职员Two的需求:这不是我负责的经理将职员Two的需求发送给了目标职员One职员One接收到来自职员Two的需求:这不是我负责的