zoukankan      html  css  js  c++  java
  • 【设计模式

    1、模式简介

    中介者模式的定义:

      用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显式地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互。

    中介者模式中的组成部分:

    • 同事类:如果两个类对象之间可以彼此影响,则称这两个类为同事类;
    • 中介者:中介者中有所有同事类的引用,定义了各个同事类之间交互的抽象方法。

    中介者模式的工作方式:

      如下两幅图所示,有6个同事类,它们之间的交互方式如下图所示。这样的话,当对象1发生变化,将影响对象2、4、5、6;当对象2发生变化时,将影响对象1、3、4、5、6。这样不仅实现起来麻烦,而且不易于维护。

      如果引入中介者,其工作情况将如下图所示。可以看到,同事类之间两两都没有了关联,都是与中介者联系了。

    中介者模式的优点:

    • 降低了类的复杂度,将一对多转化成了一对一;
    • 各个类之间的解耦;
    • 符合对象之间“高内聚、低耦合”的原则。

    中介者模式的缺点:

      中介者会庞大,变得复杂难以维护。

    中介者模式的使用场景:

    • 当系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象时;
    • 当希望通过一个中间类来封装多个类中的行为,而又不想生成太多的子类时。

    2、案例

      在这个案例中,我们模拟一个聊天室的功能:

    • 创建一个聊天室;
    • 向聊天室中添加用户;
    • 当某一个用户发布消息的时候,其他用户都可以收到消息。

      具体代码如下:

      用户类User中的代码:

    public class User {
        private String name;
    
        public User(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        public void sendMessage(ChatRoom chatRoom, String message) {
            System.out.println(name + "发出消息:" + message);
            chatRoom.operateMessage(new Message(this, message));
        }
    }

      消息类Message中的代码:

    public class Message {
        private User fromUser;
        private String content;
    
        public Message() {
        }
    
        public Message(User fromUser, String content) {
            this.fromUser = fromUser;
            this.content = content;
        }
    
        public User getFromUser() {
            return fromUser;
        }
    
        public void setFromUser(User fromUser) {
            this.fromUser = fromUser;
        }
    
        public String getContent() {
            return content;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
    }

      聊天室类ChatRoom中的代码:

    public class ChatRoom {
        private List<User> users;
    
        public ChatRoom() {
            System.out.println("聊天室开启!!");
            users = new ArrayList<User>();
        }
    
        public void addUser(User user) {
            System.out.println(user.getName() + "加入了聊天室!");
            users.add(user);
        }
    
        public void operateMessage(Message message) {
            User fromUser = message.getFromUser();
            for (User user : users) {
                if (fromUser != user) {
                    System.out.println(user.getName() + "收到了来自" + fromUser.getName() + "的消息:" + message.getContent());
                }
            }
        }
    }

      测试类Test中的代码:

    public class Test {
        public static void main(String[] args) {
            // 初始化聊天室对象
            ChatRoom chatRoom = new ChatRoom();
            // 向聊天室中添加用户
            User chatter1 = new User("Chatter1");
            User chatter2 = new User("Chatter2");
            User chatter3 = new User("Chatter3");
            User chatter4 = new User("Chatter4");
            User chatter5 = new User("Chatter5");
            User chatter6 = new User("Chatter6");
            chatRoom.addUser(chatter1);
            chatRoom.addUser(chatter2);
            chatRoom.addUser(chatter3);
            chatRoom.addUser(chatter4);
            chatRoom.addUser(chatter5);
            chatRoom.addUser(chatter6);
            System.out.println();
            // 用户之间开始交流
            chatter1.sendMessage(chatRoom, "大家好,我是Chatter1");
            System.out.println();
            chatter4.sendMessage(chatRoom, "你好,Chatter1");
        }
    }

      运行结果如下图所示:



      最后贴出中介者模式的GitHub代码地址:【GitHub - Mediator】

  • 相关阅读:
    归档:类和对象
    归档:字符串类
    腾讯云域名解析
    Java课堂动手动脑--方法
    软件工程个人作业03——PSP记录
    软件工程个人作业03
    软件工程个人作业02——PSP0级要求记录 + 第三周进度条
    软件工程个人作业02
    第二周学习进度条
    软件工程个人作业01
  • 原文地址:https://www.cnblogs.com/itgungnir/p/6211181.html
Copyright © 2011-2022 走看看