设计模式——中介者模式

172 阅读2分钟

1. 中介者模式概述

中介者模式是用来降低多个对象和类之间的通信复杂性。
这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。

(1) 适用情况

当对象与对象之间存在大量的关联关系,相互耦合时,可以考虑使用中介者模式来进行解耦。

(2) 优点

降低了类的复杂度,将一对多变成了一对一。

(3) 缺点

中介者会庞大,难以维护。

2. 中介者模式实例

使用中介者模式,来实现一个简单的租房功能。

(1) 实现用户类

public class User {
    private String name;

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

    public String getName() {
        return name;
    }
}

(2) 实现房间类

public class Room {
    private int id;

    private User owner;

    private String address;

    private float price;

    public Room(int id, String address, float price) {
        this.id = id;
        this.address = address;
        this.price = price;
    }

    public int getId() {
        return id;
    }

    public User getOwner() {
        return owner;
    }

    public void setOwner(User owner) {
        this.owner = owner;
    }

    public String getAddress() {
        return address;
    }

    public float getPrice() {
        return price;
    }
}

(3) 实现中介者

public class Mediator {
    private Map<Integer, Room> map = new HashMap<>();

    public void rentRoom(User user, int roomId) {
        Room room = map.get(roomId);
        if (room == null) {
            System.out.println("房子" + roomId + "已出租。");
            return;
        }
        System.out.println("[" + new Date().toString() + "] " + user.getName() + "以" + room.getPrice() +
                "元/平米的价格,租下了房主" + room.getOwner().getName() + "位于" + room.getAddress() + "的房子:" + room.getId());
        map.remove(roomId);
    }

    public void registerRoom(User user, Room room) {
        room.setOwner(user);
        map.put(room.getId(), room);
    }
}

(4) 租房

public class MediatorDemo {
    public static void main(String[] args) {
        Mediator mediator = new Mediator();
        User user1 = new User("小明");
        User user2 = new User("小红");
        User user3 = new User("小亮");
        User user4 = new User("小刚");

        Room room1 = new Room(1, "璀璨明珠", 2000L);
        Room room2 = new Room(2, "东方米兰", 1500L);

        // 去中介处注册房子
        mediator.registerRoom(user1, room1);
        mediator.registerRoom(user2, room2);

        // 找中介租房子
        mediator.rentRoom(user3, 1);
        mediator.rentRoom(user4, 2);
    }
}

运行结果:
image.png

3. 一些思考

如果没有中介的话,租客租不同的房子的时候需要直接去联系不同的房主才行,这样对于一个租客来说,就是一对多的关系。如果有了中介,租客只需要去找中介就好了,就变成了一对一的关系。

中介者模式和代理模式有什么区别呢? 个人觉得,从功能上看,中介者模式可以理解为对双方都进行了代理。
从实现上看,更明显的区别是,代理模式中,代理类实际上还是调用的被代理类的接口,而中介者模式则是实现了自己的逻辑。

中介者模式和外观模式有什么区别呢? 外观模式中的外观类是偏向某一方存在的,是一种单向偏向关系。而中介者并不偏向任何一方,双方通过中介者相互和另一方发生关系关系是双向的。

参考引用

中介者模式:www.runoob.com/design-patt…
中介者模式和外观模式区别:blog.csdn.net/qq_41970663…