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


    前言

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

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

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

    该模式比较简单,也是必须要结合实际的复杂业务才能说明它的作用,简单的例子看不出来,还是直接看代码演示,简单的不能再简单的一个聊天 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电子书,资料,帮忙内推,欢迎拍砖!

  • 相关阅读:
    开源爬虫综述
    html页面工具-htmlUnit
    Html JavaScript网页制作与开发完全学习手册
    移动互联网之路-李晓斌
    算法图解
    游戏编程算法与技巧
    一秒解决CentOS下service 功能 不能使用 bash: service: command not found
    LINUX企业应用案例精解 第2版 李晨光
    深入分析GCC
    嵌入式LINUX基础教程 第2版
  • 原文地址:https://www.cnblogs.com/kubixuesheng/p/10359453.html
Copyright © 2020-2023  润新知