设计模式(二十八)---调停者模式

1、简介

  调停者模式是对象的行为模式。调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显引用。从而使它们可以较松散地耦合。

  当这些对象中的某些对象之间的相互作用发生改变时,不会立即影响到其他的一些对象之间的相互作用。从而保证这些相互作用可以彼此独立地变化。

2、调停者模式类图

3、调停者模式涉及到的角色

  3.1、抽象调停者(Mediator)角色:定义出同事对象到调停者对象的接口,其中主要方法是一个(或多个)事件方法。

  3.2、具体调停者(ConcreteMediator)角色:实现了抽象调停者所声明的事件方法。具体调停者知晓所有的具体同事类,并负责具体的协调各同事对象的交互关系。

  3.3、抽象同事类(Colleague)角色:定义出调停者到同事对象的接口。同事对象只知道调停者而不知道其余的同事对象。

  3.4、具体同事类(ConcreteColleague)角色:所有的具体同事类均从抽象同事类继承而来。实现自己的业务,在需要与其他同事通信的时候,就与持有的调停者通信,调停者会负责与其他的同事交互。

 4、源代码

  4.1、抽象同事类角色

package Mediator;
/**
 * ********************************************************  
* @ClassName: Colleague 
* @Description: 抽象同事类角色
*  
**********************************************************
 */
public abstract class Colleague {
    private Mediator mediator;
    /*
     * 构造器   将调停者对象作为参数接收
     */
    public Colleague(Mediator mediator) {
        // TODO Auto-generated constructor stub
        this.mediator=mediator;
    }
    /*
     * 取值方法 提供调停者对象
     */
    public Mediator getMediator() {
        return mediator;
    }
    /*
     * 行为方法  由子类实现
     */
    public abstract void action();
    /*
     * 示意性商业方法
     * 调用此方法可以改变对象的内部状态
     */
    public void change(){
        mediator.changed(this);
    }
}

  4.2、具体同事类角色1

package Mediator;
/**
 * ********************************************************  
* @ClassName: Colleague1 
* @Description:具体同事类角色1
*  
**********************************************************
 */
public class Colleague1 extends Colleague{

    public Colleague1(Mediator mediator) {
        super(mediator);
    }

    
    public void action() {
        System.out.println("这是同事类角色1");
    }

}

  4.3、具体同事类角色2

package Mediator;
/**
 * ********************************************************  
* @ClassName: Colleague2 
* @Description: 具体同事类角色2
*  
**********************************************************
 */
public class Colleague2 extends Colleague{

    public Colleague2(Mediator mediator) {
        super(mediator);
    }

    public void action() {
        System.out.println("这个是同事类角色2");
    }

}

  4.4、抽象调停者角色

package Mediator;
/**
 * ********************************************************  
* @ClassName: Mediator 
* @Description: 抽象调停者角色
*  
**********************************************************
 */
public interface Mediator {
     public void changed(Colleague c);  
}

  4.5、具体调停者角色

package Mediator;
/**
 * ********************************************************  
* @ClassName: ConcreteMediator 
* @Description: 具体调停者角色
*  
**********************************************************
 */

public class ConcreteMediator implements Mediator{
    
    //持有并维护同事角色
    private Colleague1 colleague1;
    private Colleague2 colleague2;
    
    
    /*
     *工厂方法 创建同事对象 
     */
    public void createConcreteMediator(){
        colleague1 = new Colleague1(this);
        colleague2 = new Colleague2(this);
    }
    
    
    /*
     * 取值方法   提供同事对象
     */
    public Colleague1 getColleague1() {
        return colleague1;
    }


    /*
     * 取值方法   提供同事对象
     */
    public Colleague2 getColleague2() {
        return colleague2;
    }



    @Override
    public void changed(Colleague c) {
        // TODO Auto-generated method stub
        colleague1.action();
        colleague2.action();
    }
}

  4.5、测试客户端

package Mediator;
/**
 * ********************************************************  
* @ClassName: Client 
* @Description: 调停者模式测试客户端
*  
**********************************************************
 */
public class Client {

    public static void main(String[] args) {
        ConcreteMediator mediator = new ConcreteMediator();
        mediator.createConcreteMediator();
        Colleague2 colleague2 = new Colleague2(mediator);
        Colleague1 colleague1 = new Colleague1(mediator);
        mediator.changed(colleague1);
    }

}

5、测试,运行结果如下

原文地址:https://www.cnblogs.com/shun-gege/p/7545216.html