中介者模式

使用一个中介管理相关对象之间的交互

类图

 

示例(中介者模式来模拟用户之间的聊天)

public abstract class User {
    private IChatRoom chartroom;
    private String userId;
    private String userName;

    public User(IChatRoom room, String userId, String userName) {
        this.chartroom = room;//用户选择聊天室
        this.userId = userId;
        this.userName = userName;
    }

    public abstract void sendMessage(String msg, String userId);

    public abstract void receiveMessage(String msg);

    public String getUserId() {
        return userId;
    }

    public String getUserName() {
        return userName;
    }

    public IChatRoom getChartroom() {
        return chartroom;
    }
}

public class ChartUser extends User {
    public ChartUser(IChatRoom room, String userId, String userName) {
        super(room, userId, userName);
    }

    @Override
    public void sendMessage(String msg, String userId) {
        System.out.println(this.getUserName()+" send message:"+msg);
        this.getChartroom().sendMessage(msg,userId);
    }

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

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

//聊天室充当中介者,用来接收用户消息并转发给用户需要发送的对象。如果没有中间者,那么每一个用户需要和其他所有用户之间建立关系才能发送消息
public class ChatRoom implements IChatRoom{
    private Map<String,User> userMap = new HashMap<>();
    @Override
    public void sendMessage(String msg, String userId) {
        User user = userMap.get(userId);
        user.receiveMessage(msg);//聊天者将用户发送的消息转发给目标
    }

    @Override
    public void addUser(User user) {
        userMap.put(user.getUserId(),user);

    }
}

//测试
public class Client {
    public static void main(String[] args){
        IChatRoom chatRoom = new ChatRoom();
        //初始化用户
        User userA = new ChartUser(chatRoom,"A","USERA");
        User userB = new ChartUser(chatRoom,"B","USERB");
        //用户注册到中介
        chatRoom.addUser(userA);
        chatRoom.addUser(userB);
        //模拟发送消息
        userA.sendMessage("Hello","B");
        System.out.println("********************");
        userB.sendMessage("Hello","A");
    }
}

运行结果

 

 

posted @ 2020-02-28 20:19  Camcay  阅读(95)  评论(0)    收藏  举报