对象关系一对多转换为一对一的方案——中介者模式总结

前言

中介者模式,感受也没什么好说的,就是字面意思:对复杂对象之间进行管理,可是这个管理是双向的,既能够接受反馈,也能发出指令,实现对象之间联系的解耦合,是对象的行为型模式。故叫作中介者,或者调停者模式。服务器

简单的理解,就是能够把一对多的复杂对象关系转为一对一的简单关系。socket

实现代码——简易聊天室案例

该模式比较简单,也是必需要结合实际的复杂业务才能说明它的做用,简单的例子看不出来,仍是直接看代码演示,简单的不能再简单的一个聊天 demoide

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 个客户端的消息进行转发。避免各个客户端直接交互,减小系统的复杂度。实现对象之间联系的解耦合this

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();
    }
}

中介者模式适用场景

特别适用于复杂系统之间,纷杂的对象关系管理,尤为是对象之间引用较繁杂,结构混乱的案例,该模式特别适用于把一对多的关系转换为一对一的关系,使得结构更加清晰。spa

目前我的感受,相似IM 这种业务场景,使用的很是多。其它业务好像不是很突出。敬请指正。线程

中介者模式和观察者模式

有时候,会使用观察者模式实现中介者模式对象间的通讯。code