概述
中介者模式的提出是为了解决:一个系统中多个对象相互交互,使得整个系统变得复杂,对象之间耦合紧密,导致系统不利于维护和扩展这个现象。
在中介者模式中用一个中介类来封装对象之间的交互。这样其他对象就不需要维护对象之间的关系了。扩展关系的时候也只需要扩展或者修改中介者对象就可以了。
在中介者模式中,需要交互的对象称为同事类。它们一般都持有中介者对象的引用。但是也可以将中介者设计为一个单例,在同事类需要中介者引用的时候通过getInstance获取中介者引用。
同时由于中介者需要维护同事对象之间的关系所以也应该拥有各个同事类的引用。但是也可以在中介者处理方法中通过创建,或者获取,或者通过参数传入的方式获取同事对象。
在中介者模式中一旦一个同事发生了变化,需要主动通知中介者,让中介者去处理该变化与其他同事对象的交互。
简化的中介者模式
去掉同事类的父类,只要需要交互就可以成为同事类
不需要中介者接口,直接通过单例模式获取中介者的引用。
同事对象不再持有中介者,而是在需要的时候直接获取中介者对象,中介者也不再持有同事对象,在中介方法中通过创建,获取,参数传递的形式得到同事对象的引用。
public class CDReader { private String data = null; public void readData(String data) { this.data = data; Mediator.getInstance().changed(this); } public String getData() { return this.data; } }
|
public class CPU { private String audioData = null; private String videoData = null; public void processData(String data) { String [] datas = data.split(":"); audioData = datas[0]; videoData = datas[1]; Mediator.getInstance().changed(this); } public String getAudioData() { return audioData; } public String getVideoData() { return videoData; } }
|
public class MediaPlayer { public void playSound(String audio) { System.out.println(audio); } public void playVideo(String video) { System.out.println(video); } }
|
public class Mediator { private Mediator() {} private static class MediatorHolder{ public static Mediator mInstance = new Mediator(); } public static Mediator getInstance() { return MediatorHolder.mInstance; } private String data = null; private String audioData = null; private String videoData = null; public void changed(Object colleage) { if(colleage instanceof CDReader) { data = ((CDReader) colleage).getData(); new CPU().processData(data); }else if (colleage instanceof CPU) { audioData = ((CPU) colleage).getAudioData(); videoData = ((CPU) colleage).getVideoData(); MediaPlayer player = new MediaPlayer(); player.playSound(audioData); player.playVideo(videoData); } } }
|
public class Client { public static void main(String args[]) { new CDReader().readData("这是音乐:这是视频"); } }
|