对象关系一对多转换为一对一的方案——中介者模式总结
前言
中介者模式,感觉也没什么好说的,就是字面意思:对复杂对象之间进行管理,但是这个管理是双向的,既可以接受反馈,也能发出指令,实现对象之间联系的解耦合,是对象的行为型模式。故叫做中介者,或者调停者模式。
简单的理解,就是可以把一对多的复杂对象关系转为一对一的简单关系。
实现代码——简易聊天室案例
该模式比较简单,也是必须要结合实际的复杂业务才能说明它的作用,简单的例子看不出来,还是直接看代码演示,简单的不能再简单的一个聊天 demo
public class TCPServer { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(2000); while (true) { Socket clientSocket = serverSocket.accept(); ClientHandler clientHandler = new ClientHandler(clientSocket); clientHandler.start(); } } private static class ClientHandler extends Thread { private Socket clientSocket; private boolean flag = true; ClientHandler(Socket clientSocket) { this.clientSocket = clientSocket; } @Override public void run() { super.run(); System.out.println("新客户端连接成功:" + clientSocket.getInetAddress() + " Port: " + clientSocket.getPort()); try { OutputStream outputStream = clientSocket.getOutputStream(); PrintStream outPutPrintStream = new PrintStream(outputStream); InputStream inputStream = clientSocket.getInputStream(); BufferedReader socketInputReader = new BufferedReader(new InputStreamReader(inputStream)); do { String line = socketInputReader.readLine(); if ("bye".equalsIgnoreCase(line)) { flag = false; outPutPrintStream.println(line); } else { System.out.println(line); outPutPrintStream.println("服务端回送:" + line.length()); } } while (flag); socketInputReader.close(); outPutPrintStream.close(); } catch (Exception e) { e.printStackTrace(); } finally { try { clientSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
客户端理论上 N 个,典型的1对 N 关系,服务器就是中介者(调停者),实际业务会使用 NIO 等技术,通过服务器的转发线程,把 N 个客户端的消息进行转发。避免各个客户端直接交互,减少系统的复杂度。实现对象之间联系的解耦合
public class TCPClient { public static void main(String[] args) throws IOException { Socket socket = new Socket(); socket.setSoTimeout(2000); // 读取超时时间设置 socket.connect(new InetSocketAddress(Inet4Address.getLocalHost(), 2000), 2000); // 连接本地服务器,设置连接超时时间 2000try { todo(socket); } catch (Exception e) { e.printStackTrace(); } finally { socket.close(); } } private static void todo(Socket socket) throws IOException { InputStream inFromKeyboard = System.in; BufferedReader inFromKeyboardReader = new BufferedReader(new InputStreamReader(inFromKeyboard)); OutputStream outputStream = socket.getOutputStream(); PrintStream outPrintStream = new PrintStream(outputStream); BufferedReader bufferedReader; boolean flag = true; do { String line = inFromKeyboardReader.readLine(); outPrintStream.println(line); InputStream inputStream = socket.getInputStream(); bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String echo = bufferedReader.readLine(); if ("bye".equalsIgnoreCase(echo)) { // 如果服务端发送的是 bye 就让客户端推出 flag = false; } else { System.out.println(echo); // 回显 } } while (flag); outPrintStream.close(); bufferedReader.close(); } }
中介者模式适用场景
特别适用于复杂系统之间,纷杂的对象关系管理,尤其是对象之间引用较繁杂,结构混乱的案例,该模式特别适用于把一对多的关系转换为一对一的关系,使得结构更加清晰。
目前个人感觉,类似IM 这种业务场景,使用的非常多。其它业务好像不是很突出。敬请指正。
中介者模式和观察者模式
有时候,会使用观察者模式实现中介者模式对象间的通信。
欢迎关注
dashuai的博客是终身学习践行者,大厂程序员,且专注于工作经验、学习笔记的分享和日常吐槽,包括但不限于互联网行业,附带分享一些PDF电子书,资料,帮忙内推,欢迎拍砖!
辛苦的劳动,转载请注明出处,如果真心帮到了您,为鼓励更多的写作,您可以选择博客右侧的打赏功能。