zoukankan      html  css  js  c++  java
  • 设计模式第13篇:中介者设计模式

    一.中介者设计模式介绍

      中介者模式定义了一个中介对象来封装一系列对象之间的交互关系。中介者使各个对象之间不需要显式地相互引用,从而使耦合性降低,而且可以独立地改变它们之间的交互行为。例如构建一个群聊应用,如果没有中介者,每个用户向其他用户发送消息时都要与其他用户直接联系(显示引用),并且当新添加一个用户时还得与新用户建立联系,整个应该耦合性高,扩展起来比较复杂。当有中介者时,每个来用户直接和中介者联系,具体的消息发送与新用户的添加由中介者去复杂维护,这样程序耦合性显著降低,每个用户的行为也相互独立。

    二.中介者模式代码用例

      1.中介者抽象接口ChatMediator

    interface ChatMediator {
    
        public void sendMessage(String msg, User user);
    
        void addUser(User user);
    }

      2.用户抽象类User

      拥有一个中介者的引用,

    abstract class User {
        protected ChatMediator mediator;
        protected String name;
        
        public User(ChatMediator med, String name){
            this.mediator=med;
            this.name=name;
        }
        
        public abstract void send(String msg);
        
        public abstract void receive(String msg);
    }

      3.中介者实例CharMediatorImpl

      拥有一个群聊中的用户列表以及一个发送群消息的业务逻辑:

    class ChatMediatorImpl implements ChatMediator {
    
        private List<User> users;
        
        public ChatMediatorImpl(){
            this.users=new ArrayList<>();
        }
        
        @Override
        public void addUser(User user){
            this.users.add(user);
        }
        
        @Override
        public void sendMessage(String msg, User user) {
            for(User u : this.users){
                //message should not be received by the user sending it
                if(u != user){
                    u.receive(msg);
                }
            }
        }
    
    }

      4.用户实例UserImpl

    class UserImpl extends User {
    
        public UserImpl(ChatMediator med, String name) {
            super(med, name);
        }
    
        @Override
        public void send(String msg){
            System.out.println(this.name+": Sending Message="+msg);
            mediator.sendMessage(msg, this);
        }
        @Override
        public void receive(String msg) {
            System.out.println(this.name+": Received Message:"+msg);
        }
    
    }

      5.聊天应用客户端ChatClient

    public class ChatClient {
    
        public static void main(String[] args) {
            ChatMediator mediator = new ChatMediatorImpl();
            User user1 = new UserImpl(mediator, "Pankaj");
            User user2 = new UserImpl(mediator, "Lisa");
            User user3 = new UserImpl(mediator, "Saurabh");
            User user4 = new UserImpl(mediator, "David");
            mediator.addUser(user1);
            mediator.addUser(user2);
            mediator.addUser(user3);
            mediator.addUser(user4);
            
            user1.send("Hi All");
            
        }
    
    }

      测试输出

    Pankaj: Sending Message=Hi All
    Lisa: Received Message:Hi All
    Saurabh: Received Message:Hi All
    David: Received Message:Hi All

    三.中介者设计模式要点及场景

      1.当对象间的交互是比较复杂的时候,我们可以考虑用一个中心控制节点(中介者)来负责对象间交互的逻辑。

      2.Java中,用中介者搭配观察者设计模式,可以实现一个应用去订阅另一个用户或者发送数据给另一个应用。

      3.不能仅仅为了实现低耦合而用中介者模式,因为当需要的中介者非常多时程序将变得很难维护。

     JDK中用到中介者模式的方法:java.util.Timer类中的scheduleXXX() 方法;Concurrency Executor中的executor方法;java反射中的invoke()方法。

  • 相关阅读:
    Socket listen 简要分析
    Socket connect 等简要分析
    HIVE函数大全
    元数据管理
    flume
    shell编程
    数据仓库集锦
    数据库知识
    hive sql 转化mapreduce原理
    Hadoop 学习笔记
  • 原文地址:https://www.cnblogs.com/quxiangxiangtiange/p/10264313.html
Copyright © 2011-2022 走看看