Mediator概述
UML概述
玩具代码案例-模式计算机设备之间的通讯
调停者模式将多个组件之间的网状通讯演变成基于通过调停者统一负责转发通讯的中心模式,调停者模式常常与观察者模式配合使用。
抽象调停者
Mediator
package online.javabook.gof.behavioral.patterns4.mediator.api;
import online.javabook.gof.behavioral.patterns4.mediator.colleague.api.DeviceColleague;
import online.javabook.gof.behavioral.patterns4.mediator.listener.api.*;
public interface IMediator {
DeviceColleague getColleague(Class<? extends DeviceColleague> colleagueClass);
void registerDeviceColleague(DeviceColleague colleagueClass);
void unregisterDeviceColleague(Class<? extends DeviceColleague> colleagueClass);
IDeviceColleagueListenerProvider getProvider();
void registerDeviceColleagueListener(IDeviceColleagueListener deviceColleagueListener);
void unregisterDeviceColleagueListener(IDeviceColleagueListener deviceColleagueListener);
void doRead(Class<? extends DeviceColleague> colleagueClass, String readDate);
void doWrite(Class<? extends DeviceColleague> colleagueClass, String writeData);
}
具体调停者
ComputerMediator
package online.javabook.gof.behavioral.patterns4.mediator.impl;
import java.util.HashMap;
import java.util.Map;
import online.javabook.gof.behavioral.patterns4.mediator.api.IMediator;
import online.javabook.gof.behavioral.patterns4.mediator.colleague.api.DeviceColleague;
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.DeviceColleagueEvent;
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 online.javabook.gof.behavioral.patterns4.mediator.listener.impl.DeviceColleagueListenerProvider;
public class ComputerMediator implements IMediator {
private Map<Class, DeviceColleague> colleagues;
private IDeviceColleagueListenerProvider provider;
public ComputerMediator() {
this.colleagues = new HashMap<>();
this.provider = new DeviceColleagueListenerProvider(this);
}
@Override
public DeviceColleague getColleague(Class<? extends DeviceColleague> colleagueClass) {
return colleagues.get(colleagueClass);
}
@Override
public void registerDeviceColleague(DeviceColleague colleague) {
colleagues.put(colleague.getClass(), colleague);
}
@Override
public void unregisterDeviceColleague(Class<? extends DeviceColleague> colleagueClass) {
colleagues.remove(colleagueClass);
}
@Override
public IDeviceColleagueListenerProvider getProvider() {
return provider;
}
@Override
public void registerDeviceColleagueListener(IDeviceColleagueListener deviceColleagueListener) {
provider.registerDeviceColleagueListener(deviceColleagueListener);
}
@Override
public void unregisterDeviceColleagueListener(IDeviceColleagueListener deviceColleagueListener) {
provider.unregisterDeviceColleagueListener(deviceColleagueListener);
}
@Override
public void doRead(Class<? extends DeviceColleague> colleagueClass, String readDate) {
DeviceColleagueReadEvent event = new DeviceColleagueReadEvent(readDate, colleagueClass);
getColleague(colleagueClass).doRead(this, event);
if(colleagueClass.equals(CpuDeviceColleague.class)) {
getProvider().doCpuRead(event);
} else if(colleagueClass.equals(MemoryDeviceColleague.class)) {
getProvider().doMemoryRead(event);
} else if(colleagueClass.equals(DiskDeviceColleague.class)) {
getProvider().doDiskRead(event);
}
}
@Override
public void doWrite(Class<? extends DeviceColleague> colleagueClass, String writeData) {
DeviceColleagueWriteEvent event = new DeviceColleagueWriteEvent(writeData, colleagueClass);
getColleague(colleagueClass).doWrite(this, event);
if(colleagueClass.equals(CpuDeviceColleague.class)) {
getProvider().doCpuWrite(event);
} else if(colleagueClass.equals(MemoryDeviceColleague.class)) {
getProvider().doMemoryWrite(event);
} else if(colleagueClass.equals(DiskDeviceColleague.class)) {
getProvider().doDiskWrite(event);
}
}
}
抽象同事类
DeviceColleague
package online.javabook.gof.behavioral.patterns4.mediator.colleague.api;
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;
public abstract class DeviceColleague {
public abstract String doRead(IMediator mediator, DeviceColleagueReadEvent event);
public abstract String doWrite(IMediator mediator, DeviceColleagueWriteEvent event);
}
具体同事类
CpuDeviceColleague
package online.javabook.gof.behavioral.patterns4.mediator.colleague.impl;
import online.javabook.gof.behavioral.patterns4.mediator.api.IMediator;
import online.javabook.gof.behavioral.patterns4.mediator.colleague.api.DeviceColleague;
import online.javabook.gof.behavioral.patterns4.mediator.listener.api.DeviceColleagueReadEvent;
import online.javabook.gof.behavioral.patterns4.mediator.listener.api.DeviceColleagueWriteEvent;
public class CpuDeviceColleague extends DeviceColleague {
@Override
public String doRead(IMediator mediator, DeviceColleagueReadEvent event) {
String data = "call cpu read data <- " + event.getData();
System.out.println(data);
return data;
}
@Override
public String doWrite(IMediator mediator, DeviceColleagueWriteEvent event) {
String data = "call cpu write data -> " + event.getData();
System.out.println(data);
return data;
}
}
MemoryDeviceColleague
package online.javabook.gof.behavioral.patterns4.mediator.colleague.impl;
import online.javabook.gof.behavioral.patterns4.mediator.api.IMediator;
import online.javabook.gof.behavioral.patterns4.mediator.colleague.api.DeviceColleague;
import online.javabook.gof.behavioral.patterns4.mediator.listener.api.DeviceColleagueReadEvent;
import online.javabook.gof.behavioral.patterns4.mediator.listener.api.DeviceColleagueWriteEvent;
public class MemoryDeviceColleague extends DeviceColleague {
@Override
public String doRead(IMediator mediator, DeviceColleagueReadEvent event) {
String data = "call memory read data <- " + event.getData();
System.out.println(data);
return data;
}
@Override
public String doWrite(IMediator mediator, DeviceColleagueWriteEvent event) {
String data = "call memory write data -> " + event.getData();
System.out.println(data);
return data;
}
}
DiskDeviceColleague
package online.javabook.gof.behavioral.patterns4.mediator.colleague.impl;
import online.javabook.gof.behavioral.patterns4.mediator.api.IMediator;
import online.javabook.gof.behavioral.patterns4.mediator.colleague.api.DeviceColleague;
import online.javabook.gof.behavioral.patterns4.mediator.listener.api.DeviceColleagueReadEvent;
import online.javabook.gof.behavioral.patterns4.mediator.listener.api.DeviceColleagueWriteEvent;
public class DiskDeviceColleague extends DeviceColleague {
@Override
public String doRead(IMediator mediator, DeviceColleagueReadEvent event) {
String data = "call disk read data <- " + event.getData();
System.out.println(data);
return data;
}
@Override
public String doWrite(IMediator mediator, DeviceColleagueWriteEvent event) {
String data = "call disk write data -> " + event.getData();
System.out.println(data);
return data;
}
}
监听器事件
DeviceColleagueEvent
package online.javabook.gof.behavioral.patterns4.mediator.listener.api;
import online.javabook.gof.behavioral.patterns4.mediator.colleague.api.DeviceColleague;
public class DeviceColleagueEvent {
private String data;
private Class<? extends DeviceColleague> deviceColleagueClass;
public DeviceColleagueEvent(String data, Class<? extends DeviceColleague> deviceColleagueClass) {
this.data = data;
this.deviceColleagueClass = deviceColleagueClass;
}
public String getData() {
return data;
}
public Class<? extends DeviceColleague> getDeviceColleague() {
return deviceColleagueClass;
}
}
DeviceColleagueReadEvent
package online.javabook.gof.behavioral.patterns4.mediator.listener.api;
import online.javabook.gof.behavioral.patterns4.mediator.colleague.api.DeviceColleague;
public class DeviceColleagueReadEvent extends DeviceColleagueEvent {
public DeviceColleagueReadEvent(String data, Class<? extends DeviceColleague> deviceColleagueClass) {
super(data, deviceColleagueClass);
}
}
DeviceColleagueWriteEvent
package online.javabook.gof.behavioral.patterns4.mediator.listener.api;
import online.javabook.gof.behavioral.patterns4.mediator.colleague.api.DeviceColleague;
public class DeviceColleagueWriteEvent extends DeviceColleagueEvent {
public DeviceColleagueWriteEvent(String data, Class<? extends DeviceColleague> deviceColleagueClass) {
super(data, deviceColleagueClass);
}
}
监听器接口
IDeviceColleagueListener
设备通过监听来响应调停者的通知
package online.javabook.gof.behavioral.patterns4.mediator.listener.api;
import online.javabook.gof.behavioral.patterns4.mediator.api.IMediator;
public interface IDeviceColleagueListener {
void doCpuRead(IMediator mediator, DeviceColleagueReadEvent event);
void doCpuWrite(IMediator mediator, DeviceColleagueWriteEvent event);
void doMemoryRead(IMediator mediator, DeviceColleagueReadEvent event);
void doMemoryWrite(IMediator mediator, DeviceColleagueWriteEvent event);
void doDiskRead(IMediator mediator, DeviceColleagueReadEvent event);
void doDiskWrite(IMediator mediator, DeviceColleagueWriteEvent event);
}
默认监听器
DefaultDeviceColleagueListener
package online.javabook.gof.behavioral.patterns4.mediator.listener.api;
import online.javabook.gof.behavioral.patterns4.mediator.api.IMediator;
public class DefaultDeviceColleagueListener implements IDeviceColleagueListener {
@Override
public void doCpuRead(IMediator mediator, DeviceColleagueReadEvent event) {
}
@Override
public void doCpuWrite(IMediator mediator, DeviceColleagueWriteEvent event) {
}
@Override
public void doMemoryRead(IMediator mediator, DeviceColleagueReadEvent event) {
}
@Override
public void doMemoryWrite(IMediator mediator, DeviceColleagueWriteEvent event) {
}
@Override
public void doDiskRead(IMediator mediator, DeviceColleagueReadEvent event) {
}
@Override
public void doDiskWrite(IMediator mediator, DeviceColleagueWriteEvent event) {
}
}
监听器实现
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