Mediator概述

Mediator - 图1

UML概述

Mediator - 图2

玩具代码案例-模式计算机设备之间的通讯

调停者模式将多个组件之间的网状通讯演变成基于通过调停者统一负责转发通讯的中心模式,调停者模式常常与观察者模式配合使用。

抽象调停者

Mediator

  1. package online.javabook.gof.behavioral.patterns4.mediator.api;
  2. import online.javabook.gof.behavioral.patterns4.mediator.colleague.api.DeviceColleague;
  3. import online.javabook.gof.behavioral.patterns4.mediator.listener.api.*;
  4. public interface IMediator {
  5. DeviceColleague getColleague(Class<? extends DeviceColleague> colleagueClass);
  6. void registerDeviceColleague(DeviceColleague colleagueClass);
  7. void unregisterDeviceColleague(Class<? extends DeviceColleague> colleagueClass);
  8. IDeviceColleagueListenerProvider getProvider();
  9. void registerDeviceColleagueListener(IDeviceColleagueListener deviceColleagueListener);
  10. void unregisterDeviceColleagueListener(IDeviceColleagueListener deviceColleagueListener);
  11. void doRead(Class<? extends DeviceColleague> colleagueClass, String readDate);
  12. void doWrite(Class<? extends DeviceColleague> colleagueClass, String writeData);
  13. }

具体调停者

ComputerMediator

  1. package online.javabook.gof.behavioral.patterns4.mediator.impl;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import online.javabook.gof.behavioral.patterns4.mediator.api.IMediator;
  5. import online.javabook.gof.behavioral.patterns4.mediator.colleague.api.DeviceColleague;
  6. import online.javabook.gof.behavioral.patterns4.mediator.colleague.impl.CpuDeviceColleague;
  7. import online.javabook.gof.behavioral.patterns4.mediator.colleague.impl.DiskDeviceColleague;
  8. import online.javabook.gof.behavioral.patterns4.mediator.colleague.impl.MemoryDeviceColleague;
  9. import online.javabook.gof.behavioral.patterns4.mediator.listener.api.DeviceColleagueEvent;
  10. import online.javabook.gof.behavioral.patterns4.mediator.listener.api.DeviceColleagueReadEvent;
  11. import online.javabook.gof.behavioral.patterns4.mediator.listener.api.DeviceColleagueWriteEvent;
  12. import online.javabook.gof.behavioral.patterns4.mediator.listener.api.IDeviceColleagueListener;
  13. import online.javabook.gof.behavioral.patterns4.mediator.listener.api.IDeviceColleagueListenerProvider;
  14. import online.javabook.gof.behavioral.patterns4.mediator.listener.impl.DeviceColleagueListenerProvider;
  15. public class ComputerMediator implements IMediator {
  16. private Map<Class, DeviceColleague> colleagues;
  17. private IDeviceColleagueListenerProvider provider;
  18. public ComputerMediator() {
  19. this.colleagues = new HashMap<>();
  20. this.provider = new DeviceColleagueListenerProvider(this);
  21. }
  22. @Override
  23. public DeviceColleague getColleague(Class<? extends DeviceColleague> colleagueClass) {
  24. return colleagues.get(colleagueClass);
  25. }
  26. @Override
  27. public void registerDeviceColleague(DeviceColleague colleague) {
  28. colleagues.put(colleague.getClass(), colleague);
  29. }
  30. @Override
  31. public void unregisterDeviceColleague(Class<? extends DeviceColleague> colleagueClass) {
  32. colleagues.remove(colleagueClass);
  33. }
  34. @Override
  35. public IDeviceColleagueListenerProvider getProvider() {
  36. return provider;
  37. }
  38. @Override
  39. public void registerDeviceColleagueListener(IDeviceColleagueListener deviceColleagueListener) {
  40. provider.registerDeviceColleagueListener(deviceColleagueListener);
  41. }
  42. @Override
  43. public void unregisterDeviceColleagueListener(IDeviceColleagueListener deviceColleagueListener) {
  44. provider.unregisterDeviceColleagueListener(deviceColleagueListener);
  45. }
  46. @Override
  47. public void doRead(Class<? extends DeviceColleague> colleagueClass, String readDate) {
  48. DeviceColleagueReadEvent event = new DeviceColleagueReadEvent(readDate, colleagueClass);
  49. getColleague(colleagueClass).doRead(this, event);
  50. if(colleagueClass.equals(CpuDeviceColleague.class)) {
  51. getProvider().doCpuRead(event);
  52. } else if(colleagueClass.equals(MemoryDeviceColleague.class)) {
  53. getProvider().doMemoryRead(event);
  54. } else if(colleagueClass.equals(DiskDeviceColleague.class)) {
  55. getProvider().doDiskRead(event);
  56. }
  57. }
  58. @Override
  59. public void doWrite(Class<? extends DeviceColleague> colleagueClass, String writeData) {
  60. DeviceColleagueWriteEvent event = new DeviceColleagueWriteEvent(writeData, colleagueClass);
  61. getColleague(colleagueClass).doWrite(this, event);
  62. if(colleagueClass.equals(CpuDeviceColleague.class)) {
  63. getProvider().doCpuWrite(event);
  64. } else if(colleagueClass.equals(MemoryDeviceColleague.class)) {
  65. getProvider().doMemoryWrite(event);
  66. } else if(colleagueClass.equals(DiskDeviceColleague.class)) {
  67. getProvider().doDiskWrite(event);
  68. }
  69. }
  70. }

抽象同事类

DeviceColleague

  1. package online.javabook.gof.behavioral.patterns4.mediator.colleague.api;
  2. import online.javabook.gof.behavioral.patterns4.mediator.api.IMediator;
  3. import online.javabook.gof.behavioral.patterns4.mediator.listener.api.DeviceColleagueReadEvent;
  4. import online.javabook.gof.behavioral.patterns4.mediator.listener.api.DeviceColleagueWriteEvent;
  5. public abstract class DeviceColleague {
  6. public abstract String doRead(IMediator mediator, DeviceColleagueReadEvent event);
  7. public abstract String doWrite(IMediator mediator, DeviceColleagueWriteEvent event);
  8. }

具体同事类

CpuDeviceColleague

  1. package online.javabook.gof.behavioral.patterns4.mediator.colleague.impl;
  2. import online.javabook.gof.behavioral.patterns4.mediator.api.IMediator;
  3. import online.javabook.gof.behavioral.patterns4.mediator.colleague.api.DeviceColleague;
  4. import online.javabook.gof.behavioral.patterns4.mediator.listener.api.DeviceColleagueReadEvent;
  5. import online.javabook.gof.behavioral.patterns4.mediator.listener.api.DeviceColleagueWriteEvent;
  6. public class CpuDeviceColleague extends DeviceColleague {
  7. @Override
  8. public String doRead(IMediator mediator, DeviceColleagueReadEvent event) {
  9. String data = "call cpu read data <- " + event.getData();
  10. System.out.println(data);
  11. return data;
  12. }
  13. @Override
  14. public String doWrite(IMediator mediator, DeviceColleagueWriteEvent event) {
  15. String data = "call cpu write data -> " + event.getData();
  16. System.out.println(data);
  17. return data;
  18. }
  19. }

MemoryDeviceColleague

  1. package online.javabook.gof.behavioral.patterns4.mediator.colleague.impl;
  2. import online.javabook.gof.behavioral.patterns4.mediator.api.IMediator;
  3. import online.javabook.gof.behavioral.patterns4.mediator.colleague.api.DeviceColleague;
  4. import online.javabook.gof.behavioral.patterns4.mediator.listener.api.DeviceColleagueReadEvent;
  5. import online.javabook.gof.behavioral.patterns4.mediator.listener.api.DeviceColleagueWriteEvent;
  6. public class MemoryDeviceColleague extends DeviceColleague {
  7. @Override
  8. public String doRead(IMediator mediator, DeviceColleagueReadEvent event) {
  9. String data = "call memory read data <- " + event.getData();
  10. System.out.println(data);
  11. return data;
  12. }
  13. @Override
  14. public String doWrite(IMediator mediator, DeviceColleagueWriteEvent event) {
  15. String data = "call memory write data -> " + event.getData();
  16. System.out.println(data);
  17. return data;
  18. }
  19. }

DiskDeviceColleague

  1. package online.javabook.gof.behavioral.patterns4.mediator.colleague.impl;
  2. import online.javabook.gof.behavioral.patterns4.mediator.api.IMediator;
  3. import online.javabook.gof.behavioral.patterns4.mediator.colleague.api.DeviceColleague;
  4. import online.javabook.gof.behavioral.patterns4.mediator.listener.api.DeviceColleagueReadEvent;
  5. import online.javabook.gof.behavioral.patterns4.mediator.listener.api.DeviceColleagueWriteEvent;
  6. public class DiskDeviceColleague extends DeviceColleague {
  7. @Override
  8. public String doRead(IMediator mediator, DeviceColleagueReadEvent event) {
  9. String data = "call disk read data <- " + event.getData();
  10. System.out.println(data);
  11. return data;
  12. }
  13. @Override
  14. public String doWrite(IMediator mediator, DeviceColleagueWriteEvent event) {
  15. String data = "call disk write data -> " + event.getData();
  16. System.out.println(data);
  17. return data;
  18. }
  19. }

监听器事件

DeviceColleagueEvent

  1. package online.javabook.gof.behavioral.patterns4.mediator.listener.api;
  2. import online.javabook.gof.behavioral.patterns4.mediator.colleague.api.DeviceColleague;
  3. public class DeviceColleagueEvent {
  4. private String data;
  5. private Class<? extends DeviceColleague> deviceColleagueClass;
  6. public DeviceColleagueEvent(String data, Class<? extends DeviceColleague> deviceColleagueClass) {
  7. this.data = data;
  8. this.deviceColleagueClass = deviceColleagueClass;
  9. }
  10. public String getData() {
  11. return data;
  12. }
  13. public Class<? extends DeviceColleague> getDeviceColleague() {
  14. return deviceColleagueClass;
  15. }
  16. }

DeviceColleagueReadEvent

  1. package online.javabook.gof.behavioral.patterns4.mediator.listener.api;
  2. import online.javabook.gof.behavioral.patterns4.mediator.colleague.api.DeviceColleague;
  3. public class DeviceColleagueReadEvent extends DeviceColleagueEvent {
  4. public DeviceColleagueReadEvent(String data, Class<? extends DeviceColleague> deviceColleagueClass) {
  5. super(data, deviceColleagueClass);
  6. }
  7. }

DeviceColleagueWriteEvent

  1. package online.javabook.gof.behavioral.patterns4.mediator.listener.api;
  2. import online.javabook.gof.behavioral.patterns4.mediator.colleague.api.DeviceColleague;
  3. public class DeviceColleagueWriteEvent extends DeviceColleagueEvent {
  4. public DeviceColleagueWriteEvent(String data, Class<? extends DeviceColleague> deviceColleagueClass) {
  5. super(data, deviceColleagueClass);
  6. }
  7. }

监听器接口

IDeviceColleagueListener

设备通过监听来响应调停者的通知

  1. package online.javabook.gof.behavioral.patterns4.mediator.listener.api;
  2. import online.javabook.gof.behavioral.patterns4.mediator.api.IMediator;
  3. public interface IDeviceColleagueListener {
  4. void doCpuRead(IMediator mediator, DeviceColleagueReadEvent event);
  5. void doCpuWrite(IMediator mediator, DeviceColleagueWriteEvent event);
  6. void doMemoryRead(IMediator mediator, DeviceColleagueReadEvent event);
  7. void doMemoryWrite(IMediator mediator, DeviceColleagueWriteEvent event);
  8. void doDiskRead(IMediator mediator, DeviceColleagueReadEvent event);
  9. void doDiskWrite(IMediator mediator, DeviceColleagueWriteEvent event);
  10. }

默认监听器

DefaultDeviceColleagueListener

  1. package online.javabook.gof.behavioral.patterns4.mediator.listener.api;
  2. import online.javabook.gof.behavioral.patterns4.mediator.api.IMediator;
  3. public class DefaultDeviceColleagueListener implements IDeviceColleagueListener {
  4. @Override
  5. public void doCpuRead(IMediator mediator, DeviceColleagueReadEvent event) {
  6. }
  7. @Override
  8. public void doCpuWrite(IMediator mediator, DeviceColleagueWriteEvent event) {
  9. }
  10. @Override
  11. public void doMemoryRead(IMediator mediator, DeviceColleagueReadEvent event) {
  12. }
  13. @Override
  14. public void doMemoryWrite(IMediator mediator, DeviceColleagueWriteEvent event) {
  15. }
  16. @Override
  17. public void doDiskRead(IMediator mediator, DeviceColleagueReadEvent event) {
  18. }
  19. @Override
  20. public void doDiskWrite(IMediator mediator, DeviceColleagueWriteEvent event) {
  21. }
  22. }

监听器实现

CpuDeviceColleagueListener

package online.javabook.gof.behavioral.patterns4.mediator.listener.impl;

import online.javabook.gof.behavioral.patterns4.mediator.api.IMediator;
import online.javabook.gof.behavioral.patterns4.mediator.listener.api.DefaultDeviceColleagueListener;
import online.javabook.gof.behavioral.patterns4.mediator.listener.api.DeviceColleagueReadEvent;

public class CpuDeviceColleagueListener extends DefaultDeviceColleagueListener {

    @Override
    public void doMemoryRead(IMediator mediator, DeviceColleagueReadEvent event) {
        System.out.println("我是CPU,我收到Memory读取的数据" + event.getData());
    }
}

MemoryDeviceColleagueListener

package online.javabook.gof.behavioral.patterns4.mediator.listener.impl;

import online.javabook.gof.behavioral.patterns4.mediator.api.IMediator;
import online.javabook.gof.behavioral.patterns4.mediator.colleague.impl.CpuDeviceColleague;
import online.javabook.gof.behavioral.patterns4.mediator.colleague.impl.DiskDeviceColleague;
import online.javabook.gof.behavioral.patterns4.mediator.colleague.impl.MemoryDeviceColleague;
import online.javabook.gof.behavioral.patterns4.mediator.listener.api.DefaultDeviceColleagueListener;
import online.javabook.gof.behavioral.patterns4.mediator.listener.api.DeviceColleagueReadEvent;
import online.javabook.gof.behavioral.patterns4.mediator.listener.api.DeviceColleagueWriteEvent;

public class MemoryDeviceColleagueListener extends DefaultDeviceColleagueListener {

    @Override
    public void doDiskRead(IMediator mediator, DeviceColleagueReadEvent event) {
        System.out.println("我是Memory,我收到Disk读取的数据" + event.getData());
        mediator.doRead(MemoryDeviceColleague.class, event.getData());
    }

    @Override
    public void doCpuWrite(IMediator mediator, DeviceColleagueWriteEvent event) {
        System.out.println("我是Memory,我收到CPU写入的数据" + event.getData());
        mediator.doWrite(MemoryDeviceColleague.class, event.getData());
    }
}

DiskDeviceColleagueListener

package online.javabook.gof.behavioral.patterns4.mediator.listener.impl;

import online.javabook.gof.behavioral.patterns4.mediator.api.IMediator;
import online.javabook.gof.behavioral.patterns4.mediator.colleague.impl.MemoryDeviceColleague;
import online.javabook.gof.behavioral.patterns4.mediator.listener.api.DefaultDeviceColleagueListener;
import online.javabook.gof.behavioral.patterns4.mediator.listener.api.DeviceColleagueReadEvent;
import online.javabook.gof.behavioral.patterns4.mediator.listener.api.DeviceColleagueWriteEvent;

public class DiskDeviceColleagueListener extends DefaultDeviceColleagueListener {

    @Override
    public void doMemoryWrite(IMediator mediator, DeviceColleagueWriteEvent event) {
        System.out.println("我是Disk,我收到Memory写入的数据" + event.getData());
    }
}

监听器Provider

IDeviceColleagueListenerProvider

package online.javabook.gof.behavioral.patterns4.mediator.listener.api;

import java.util.List;

public interface IDeviceColleagueListenerProvider {

    List<IDeviceColleagueListener> getDeviceColleagueListeners();

    void registerDeviceColleagueListener(IDeviceColleagueListener serviceBusListener);

    void unregisterDeviceColleagueListener(IDeviceColleagueListener serviceBusListener);

    void doCpuRead(DeviceColleagueReadEvent event);

    void doCpuWrite(DeviceColleagueWriteEvent event);

    void doMemoryRead(DeviceColleagueReadEvent event);

    void doMemoryWrite(DeviceColleagueWriteEvent event);

    void doDiskRead(DeviceColleagueReadEvent event);

    void doDiskWrite(DeviceColleagueWriteEvent event);
}

DeviceColleagueListenerProvider

package online.javabook.gof.behavioral.patterns4.mediator.listener.impl;

import online.javabook.gof.behavioral.patterns4.mediator.api.IMediator;
import online.javabook.gof.behavioral.patterns4.mediator.listener.api.DeviceColleagueReadEvent;
import online.javabook.gof.behavioral.patterns4.mediator.listener.api.DeviceColleagueWriteEvent;
import online.javabook.gof.behavioral.patterns4.mediator.listener.api.IDeviceColleagueListener;
import online.javabook.gof.behavioral.patterns4.mediator.listener.api.IDeviceColleagueListenerProvider;

import java.util.ArrayList;
import java.util.List;

public class DeviceColleagueListenerProvider implements IDeviceColleagueListenerProvider {

    private IMediator mediator;

    private List<IDeviceColleagueListener> deviceColleagueListeners = new ArrayList<>();

    public DeviceColleagueListenerProvider(IMediator mediator) {
        this.mediator = mediator;
    }

    public List<IDeviceColleagueListener> getDeviceColleagueListeners() {
        return deviceColleagueListeners;
    }

    public void registerDeviceColleagueListener(IDeviceColleagueListener deviceColleagueListener) {
        this.deviceColleagueListeners.add(deviceColleagueListener);
    }

    public void unregisterDeviceColleagueListener(IDeviceColleagueListener deviceColleagueListener) {
        this.deviceColleagueListeners.remove(deviceColleagueListener);
    }

    @Override
    public void doCpuRead(DeviceColleagueReadEvent event) {
        for (IDeviceColleagueListener deviceColleagueListener : deviceColleagueListeners) {
            deviceColleagueListener.doCpuRead(mediator, event);
        }
    }

    @Override
    public void doCpuWrite(DeviceColleagueWriteEvent event) {
        for (IDeviceColleagueListener deviceColleagueListener : deviceColleagueListeners) {
            deviceColleagueListener.doCpuWrite(mediator, event);
        }
    }

    @Override
    public void doMemoryRead(DeviceColleagueReadEvent event) {
        for (IDeviceColleagueListener deviceColleagueListener : deviceColleagueListeners) {
            deviceColleagueListener.doMemoryRead(mediator, event);
        }
    }

    @Override
    public void doMemoryWrite(DeviceColleagueWriteEvent event) {
        for (IDeviceColleagueListener deviceColleagueListener : deviceColleagueListeners) {
            deviceColleagueListener.doMemoryWrite(mediator, event);
        }
    }

    @Override
    public void doDiskRead(DeviceColleagueReadEvent event) {
        for (IDeviceColleagueListener deviceColleagueListener : deviceColleagueListeners) {
            deviceColleagueListener.doDiskRead(mediator, event);
        }
    }

    @Override
    public void doDiskWrite(DeviceColleagueWriteEvent event) {
        for (IDeviceColleagueListener deviceColleagueListener : deviceColleagueListeners) {
            deviceColleagueListener.doDiskWrite(mediator, event);
        }
    }
}

调停者调用

Main

package online.javabook.gof.behavioral.patterns4.mediator.app;

import online.javabook.gof.behavioral.patterns4.mediator.api.IMediator;
import online.javabook.gof.behavioral.patterns4.mediator.colleague.impl.CpuDeviceColleague;
import online.javabook.gof.behavioral.patterns4.mediator.colleague.impl.DiskDeviceColleague;
import online.javabook.gof.behavioral.patterns4.mediator.colleague.impl.MemoryDeviceColleague;
import online.javabook.gof.behavioral.patterns4.mediator.impl.ComputerMediator;
import online.javabook.gof.behavioral.patterns4.mediator.listener.api.DeviceColleagueReadEvent;
import online.javabook.gof.behavioral.patterns4.mediator.listener.api.DeviceColleagueWriteEvent;
import online.javabook.gof.behavioral.patterns4.mediator.listener.impl.CpuDeviceColleagueListener;
import online.javabook.gof.behavioral.patterns4.mediator.listener.impl.DiskDeviceColleagueListener;
import online.javabook.gof.behavioral.patterns4.mediator.listener.impl.MemoryDeviceColleagueListener;

public class Main {
    public static void main(String[] args) {
        IMediator mediator = new ComputerMediator();

        // colleagues
        mediator.registerDeviceColleague(new CpuDeviceColleague());
        mediator.registerDeviceColleague(new MemoryDeviceColleague());
        mediator.registerDeviceColleague(new DiskDeviceColleague());

        // listeners
        mediator.registerDeviceColleagueListener(new MemoryDeviceColleagueListener());
        mediator.registerDeviceColleagueListener(new CpuDeviceColleagueListener());
        mediator.registerDeviceColleagueListener(new DiskDeviceColleagueListener());

        // mediator
        mediator.doRead(DiskDeviceColleague.class, "rrr");

        System.out.println("--------------------------------");

        // write
        mediator.doWrite(CpuDeviceColleague.class, "www");

    }
}

Console

call disk read data <- rrr
我是Memory,我收到Disk读取的数据rrr
call memory read data <- rrr
我是CPU,我收到Memory读取的数据rrr
--------------------------------
call cpu write data -> www
我是Memory,我收到CPU写入的数据www
call memory write data -> www
我是Disk,我收到Memory写入的数据www