设计模式代码实战-中间者模式

1、问题描述

小明正在设计一个简单的多人聊天室系统,有多个用户和一个聊天室中介者,用户通过中介者进行聊天,请你帮他完成这个系统的设计。

输入示例
3
User1 User2 User3
User1 Hello_All!
User2 Hi_User1!
User3 How_is_everyone?

输出示例
User2 received: Hello_All!
User3 received: Hello_All!
User1 received: Hi_User1!
User3 received: Hi_User1!
User1 received: How_is_everyone?
User2 received: How_is_everyone?

2、中间者模式

作者认为的核心理念
中间者:持有所有代理,负责发送和接收代理的信息(包含两个方法)
代理:包含中间者引用,消息都是发送给中间者,中间者再掉用自己的发送信息方法
请添加图片描述

3、代码

import com.sun.java.accessibility.util.TopLevelWindowListener;

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);

        int number=sc.nextInt();
        sc.nextLine();
        Platform p=new QQ();
        String s=sc.nextLine();
        String[] names=s.split(" ");

        for(int i=0;i<number;i++){
            User u=new User(p,names[i]);
            p.register(u);
            p.register(u);
        }
        while(sc.hasNextLine()){
            String input=sc.nextLine();
            if(input.isEmpty()){
                break;
            }
            String[] inputs=input.split(" ");
            User u=p.getUser(inputs[0]);
            u.send(inputs[1]);
        }

    }
}

interface Platform{
    void register(User u);
    void send(String message,User u);
    User getUser(String userName);
}

class QQ implements Platform{
    private Map<String,User> hashMap;
    public QQ(){
        this.hashMap=new LinkedHashMap<>();
    }
    @Override
    public void register(User u) {
        this.hashMap.put(u.getUserName(),u);
    }

    @Override
    public void send(String message, User u) {
        for(User tmp:this.hashMap.values()){
            if(!tmp.getUserName().equals(u.getUserName())){
                tmp.receive(message);
            }
        }
    }

    @Override
    public User getUser(String userName) {
        return hashMap.get(userName)==null?null:hashMap.get(userName);
    }
}

interface Agent{
    void send(String message);
    void receive(String message);
}

class User implements Agent{
    private Platform qq;
    private String name;
    public User(Platform p,String userName){
        this.qq=p;
        this.name=userName;
    }
    public String getUserName(){
        return this.name;
    }
    @Override
    public void send(String message) {
            qq.send(message,this);
    }

    @Override
    public void receive(String message) {
        System.out.println(this.name+" received: "+message);
    }
}

相关推荐

  1. 设计模式——中介模式

    2024-04-21 03:00:03       56 阅读
  2. 设计模式-中介模式

    2024-04-21 03:00:03       56 阅读
  3. 设计模式中介模式

    2024-04-21 03:00:03       34 阅读
  4. 设计模式中介模式

    2024-04-21 03:00:03       35 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-21 03:00:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-21 03:00:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-21 03:00:03       87 阅读
  4. Python语言-面向对象

    2024-04-21 03:00:03       96 阅读

热门阅读

  1. Kibana启动报错:Kibana server is not ready yet

    2024-04-21 03:00:03       35 阅读
  2. konva.js 工具类

    2024-04-21 03:00:03       31 阅读
  3. 设计模式(分类)

    2024-04-21 03:00:03       36 阅读
  4. OpenXR API概览与核心组件解析

    2024-04-21 03:00:03       36 阅读
  5. NLP和LLMs: 理解它们之间的区别

    2024-04-21 03:00:03       35 阅读
  6. Oracle中的时间戳转换与使用

    2024-04-21 03:00:03       36 阅读