设计模式-中介者模式

1.定义

中介者模式将同类对象之间的交互封装起来,使得同类对象之间不需要互相作用,而是把这种调用的行为放在中介对象中去进行;好处是降低了对象之间的耦合,是一种行为类模式;为什么要使用中介者模式?一般来说,同事类之间的关系是复杂的,多个同事类之间相互关联,会呈现出一种网络结果,这种过度耦合的网络结构,不利于系统的复用。

下面举个例子来说明下

2.例子

现在有个简单的场景:两个人之间可以互相聊天,那么简单点,程序可以这么来写:

public class People {
    private String name;
    private People people;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void connect(People people) {
        this.people = people;
    }

    public void talk(String msg) {
        System.out.println(this.getName() + "对" + this.people.getName() + "说:" + msg);
    }

    public People(String name) {
        this.name = name;
    }

    public static void main(String[] args) {
        People people1 = new People("张三");
        People people2 = new People("李四");
        people1.connect(people2);
        people2.connect(people1);

        people1.talk("尼好,很高兴认识你");
        people2.talk("我也是哦");
    }
}

每个people对象持有要聊天对象的一个引用;connect方法将建立起连接;运行结果如下

张三对李四说:尼好,很高兴认识你
李四对张三说:我也是哦

这里只是2个人之间,如果是很多个人之间聊天,那么就涉及到每个人都会持有其他人的引用,任何一个人的加入或者离开都要修改其他的人的持有用户的关系,所以可以考虑把这部分逻辑抽取出来,放在一个中介类里面ChatRoom,抽象出一个聊天室的中介类,任何用户的聊天行为都通过ChatRoom这个类来处理;具体代码如下

public class User {

    private String name;

    private ChatRoom chatRoom;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public ChatRoom getChatRoom() {
        return chatRoom;
    }

    public void setChatRoom(ChatRoom chatRoom) {
        this.chatRoom = chatRoom;
    }

    public void login() {
        this.chatRoom.addUser(this);
    }

    public void logout() {
        this.chatRoom.removeUser(this);
    }

    public void sendMsg(String msg) {
        this.chatRoom.talk(this, msg);
    }

    public void listen(User user, String msg) {
        System.out.println(this.getName() + "收到一条消息:" + user.getName() + "说:" + msg);
    }
}

User对象,user有登录和登出功能,登录的时候会调用聊天室的adduser添加用户,登出的时候调用聊天室的删除用户方法;用户还可以发送消息,然后还可以接受其他用户的消息;之后是聊天室ChatRoom类

public class ChatRoom {

    private List<User> users = new ArrayList<>();

    public void addUser(User user) {
        this.users.add(user);
    }

    public void removeUser(User user) {
        this.users.remove(user);
    }

    public void talk(User user, String msg) {
        System.out.println(user.getName() + "发送了一条消息:" + msg);
        this.users.stream().filter(t -> t.getName() != user.getName()).forEach(u -> u.listen(user, msg));
    }
}

聊天室持有所有用户的一个列表,然后有添加和移除用户的功能,talk方法,用来向其他用户发送信息;测试代码如下所示

public static void main(String[] args) {
        ChatRoom chatRoom = new ChatRoom();
        User user1 = new User();
        user1.setName("张三");
        user1.setChatRoom(chatRoom);
        user1.login();
        User user2 = new User();
        user2.setName("李四");
        user2.setChatRoom(chatRoom);
        user2.login();
        User user3 = new User();
        user3.setName("王五");
        user3.setChatRoom(chatRoom);
        user3.login();

        user1.sendMsg("大家好,我是新来的");
    }

运行结果如图所示

张三发送了一条消息:大家好,我是新来的
李四收到一条消息:张三说:大家好,我是新来的
王五收到一条消息:张三说:大家好,我是新来的

总结:当对象之间互相引用多的时候,考虑使用中介模式,降低对象之间的耦合;微服务中的注册中心其实也是使用中介模式,把服务的注册和寻址都放在注册中心上进行,而各个服务之间不需要关注其他服务的细节;

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值