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

调停者模式

场景:

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


应用:

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


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

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


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的需求:这不是我负责的

猜你喜欢

转载自blog.csdn.net/huanghailiang_ws/article/details/78348313