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


    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、测试,运行结果如下

  • 相关阅读:
    第八周
    请停止使用strncpy
    WER设置
    如何在dump文件里找到真正的类this指针
    Visual Studio /analyze不好之处---漏报(四)
    Visual Studio /analyze不好之处---漏报(三)
    Visual Studio /analyze不好之处---漏报(二)
    Visual Studio /analyze不好之处(一)
    Visual Studio /analyze的好处
    符号杂谈
  • 原文地址:https://www.cnblogs.com/shun-gege/p/7545216.html
Copyright © 2020-2023  润新知