关于java:微信和QQ这么多群该如何管理好友关系

3次阅读

共计 2542 个字符,预计需要花费 7 分钟才能阅读完成。

本文节选自《设计模式就该这样学》

1 中介者模式的利用场景

在现实生活中,中介者的存在是不可短少的,如果没有了中介者,咱们就不能与远方的敌人进行交换。各个共事对象将会互相进行援用,如果每个对象都与多个对象进行交互,则会造成如下图所示的网状结构。

从上图能够看到,每个对象之间都适度耦合,这样既不利于信息的复用也不利于扩大。如果引入中介者模式,则对象之间的关系将变成星形构造,如下图所示。

从上图能够看到,应用中介者模式后,任何一个类的变动,只会影响中介者和类自身,不像之前的设计,任何一个类的变动都会引起其关联的所有类的变动。这样的设计大大减少了零碎的耦合度。
其实日常生活中咱们每天都在刷的朋友圈,就是一个中介者。还有咱们所见的信息交易平台,也是中介者模式的体现。

中介者模式是用来升高多个对象和类之间的通信复杂性的。这种模式通过提供一个中介类,将零碎各层次对象间的多对多关系变成一对多关系,中介者对象能够将简单的网状结构变成以中介者为核心的星形构造,达到升高零碎的复杂性、进步可扩展性的作用。
若零碎各层次对象之间存在大量的关联关系,即档次对象呈简单的网状结构,如果间接让它们紧耦合通信,会使系统结构变得异样简单,且当其中某个档次对象产生扭转时,则与其紧耦合的相应档次对象也需进行批改,零碎很难进行保护。
简略地说,如果多个类互相耦合,造成了网状结构,则思考应用中介者模式进行优化。总结一下,中介者模式次要实用于以下利用场景。

(1)零碎中对象之间存在简单的援用关系,产生的相互依赖关系构造凌乱且难以了解。

(2)交互的公共行为,如果须要扭转行为,则能够减少新的中介者类。

2 中介者模式的 UML 类图

中介者模式的 UML 类图如下图所示。

3 应用中介者模式设计群聊场景

假如咱们要构建一个聊天室零碎,用户能够向聊天室发送音讯,聊天室会向所有用户显示音讯。实际上就是用户发信息与聊天室显示的通信过程,不过用户无奈间接将信息发给聊天室,而须要将信息先发到服务器上,而后服务器再将该音讯发给聊天室进行显示,具体代码如下。首先创立 User 类。


public class User {
    private String name;
    private ChatRoom chatRoom;

    public User(String name, ChatRoom chatRoom) {
        this.name = name;
        this.chatRoom = chatRoom;
    }

    public void sendMessage(String msg) {this.chatRoom.showMsg(this, msg);
    }

    public String getName() {return name;}
}

而后创立 ChatRoom 类。


public class ChatRoom {public void showMsg(User user, String msg) {System.out.println("[" + user.getName() + "] :" + msg);
    }
}

最初编写客户端测试代码。


public static void main(String[] args) {ChatRoom room = new ChatRoom();

        User tom = new User("Tom",room);
        User jerry = new User("Jerry",room);
        tom.sendMessage("Hi! I am Tom.");
        jerry.sendMessage("Hello! My name is Jerry.");
}

运行后果如下图所示。

4 中介者模式在 JDK 源码中的利用

首先来看 JDK 中的 Timer 类。关上 Timer 的构造,咱们发现 Timer 类中有很多 schedule() 重载办法,如下图所示。

任意点开其中一个办法,咱们发现所有办法最终都调用了公有的 schedule() 办法,源码如下。


public class Timer {
    ...    
    public void schedule(TimerTask task, long delay) {if (delay < 0)
            throw new IllegalArgumentException("Negative delay.");
        sched(task, System.currentTimeMillis()+delay, 0);
    }
    ...
    private void sched(TimerTask task, long time, long period) {if (time < 0)
            throw new IllegalArgumentException("Illegal execution time.");

        if (Math.abs(period) > (Long.MAX_VALUE >> 1))
            period >>= 1;

        synchronized(queue) {if (!thread.newTasksMayBeScheduled)
                throw new IllegalStateException("Timer already cancelled.");

            synchronized(task.lock) {if (task.state != TimerTask.VIRGIN)
                    throw new IllegalStateException("Task already scheduled or cancelled");
                task.nextExecutionTime = time;
                task.period = period;
                task.state = TimerTask.SCHEDULED;
            }

            queue.add(task);
            if (queue.getMin() == task)
                queue.notify();}
    }
    ...
}

而且,不论是什么样的工作都被退出一个队列中按程序执行。咱们把这个队列中的所有对象都称为“共事”。共事之间的通信都是通过 Timer 来协调实现的,Timer 承当了中介者的角色。

关注微信公众号『Tom 弹架构』回复“设计模式”可获取残缺源码。

【举荐】Tom 弹架构:30 个设计模式实在案例(附源码),挑战年薪 60W 不是梦

本文为“Tom 弹架构”原创,转载请注明出处。技术在于分享,我分享我高兴!
如果本文对您有帮忙,欢送关注和点赞;如果您有任何倡议也可留言评论或私信,您的反对是我保持创作的能源。关注微信公众号『Tom 弹架构』可获取更多技术干货!

正文完
 0