ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java设计模式之中介者模式

2020-11-19 23:31:30  阅读:184  来源: 互联网

标签:java 同事 中介 User chatRoom 模式 设计模式 public


中介者模式的定义:

  中结者模式又叫作调解者模式或调停者模式。用一个中介对象封装一系列对象交互,中介者使各对象不需要显示地相互作用,

从而使其耦合松散,而且可以独立得改变它们之间得交互,属于行为型设计模式。

中介者模式得应用场景:

  • 系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解。
  • 交互的公共行为,如果需要改变行为,则可以增加新的中介者类。

中介者模式的UML类图:

 由上图可以看到,中介者模式主要包含4个角色。

  1. 抽象中介者(Mediator):定义统一的接口,用于各个同事之间的通信。
  2. 具体中介者(ConcreteMediator):从具体的同事对象接收消息,向具体的同事对象发出命令,协调各同事间的协作。
  3. 抽象同事类(Colleague):每一个同事对象均需要依赖中介者角色,于其他同事间通信时,交由中介者进行转发协作。
  4. 具体同事类(ConcreteColleague):负责实现自发行为,转发依赖方法交由中介者进行协调。、

使用中介者模式设计群聊场景:

  假设我们需要构建一个聊天室系统,用户可以向聊天室发送消息,聊天室会向所有用户显示消息。实际上就是用户发消息

与聊天室显示的通信过程,不过用户无法直接将信息发给聊天室,而需要将信息先发到服务器上,然后服务器再将该消息发给

聊天室进行显示,具体代码如下。首先创建User类。

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

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

    public String getName() {
        return name;
    }

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

然后创建ChatRoom类。

public class ChatRoom {

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

最后编写测试代码。

public class Test {
    public static void main(String[] args) {
        ChatRoom chatRoom = new ChatRoom();

        User tom = new User("Tom",chatRoom);
        User jerry = new User("Jerry",chatRoom);

        tom.sendMessage("Hi! I am Tom.");
        jerry.sendMessage("Hello! My name is Jerry.");
    }
}

中介者模式的优点:

  • 减少类间的依赖,将多对多依赖转化成一对多,降低了类间耦合。
  • 类间各司其职,符合迪米特法则。

中介者模式的缺点:

  中介者模式将原本多个对象直接的相互依赖变成了中介者和多个同事类的依赖关系。

当同事类越多时,中介者就会臃肿,变得复杂且难以维护。

标签:java,同事,中介,User,chatRoom,模式,设计模式,public
来源: https://www.cnblogs.com/liu-yi/p/14008533.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有