设计模式第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()方法。

posted @ 2019-01-13 22:20  曲项向天歌  阅读(173)  评论(0编辑  收藏  举报