中介者模式浅谈

79 阅读3分钟

「这是我参与2022首次更文挑战的第37天,活动详情查看:2022首次更文挑战」。

一、什么是中介者模式

开始工作的时候,我们在外面租房子住,我们是通过一个一个的去找,还是通过中介去完成呢?如果是我们一个一个的去看,可能需要花费很多时间,但如果通过中介的话,可能很快就会找到自己想租的(虽然中介费的确贵)。中介者模式:又叫调停模式,定义一个中介对象封装一系列对象之间的交互,降低对象之间的耦合性,并且可以完成对象之间的交互。

二、中介者模式的实现

没有中间商赚差价,下面说的就是客户与汽车中介的故事。

public interface Mediator {
    void add(Customer customer);

    void forward(Customer customer);
}

抽象中介者,可以添加客户对象。买方和卖方都是中介的客户。以及转发接口。

public class CarMediator implements Mediator{
    @Getter
    private final List<Customer> customers = new ArrayList<>();

    @Override
    public void add(Customer customer) {
        if (!customers.contains(customer)) {
            customers.add(customer);
            customer.setMediator(this);
        }
    }

    @Override
    public void forward(Customer customer) {
        for (Customer c : customers) {
            if (!c.equals(customer)){
                if (c instanceof Buyer){
                    System.out.println("中介偷偷加加价格20W");
                }
                c.receive();
            }
        }
    }
}

具体中介者对象,具体的汽车中介。

public abstract class Customer {

    protected Mediator mediator;

    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
    }


    public abstract void receive();

    public abstract void send();
}

抽象客户,包括发送和接收方法。

public class Buyer extends Customer {
    @Override
    public void receive() {
        System.out.println("买方收到消息");
    }

    @Override
    public void send() {
        System.out.println("车子具体需要多少钱");
        mediator.forward(this);
    }
}

具体客户,买方。

public class Seller extends Customer {
    @Override
    public void receive() {
        System.out.println("卖方收到消息");
    }

    @Override
    public void send() {
        System.out.println("卖方报价10W");
        mediator.forward(this);
    }
}

具体客户,卖方。

public class MediatorTest {
    public static void main(String[] args) throws ClassNotFoundException {
        CarMediator mediator = new CarMediator();
        Buyer buyer = new Buyer();
        Seller seller = new Seller();
        mediator.add(buyer);
        mediator.add(seller);
        buyer.send();
        seller.send();
    }
}

此处就是一个典型的通过中介买车的问题了,中介的确省去了我们自己寻找卖家的过程,但是可能会有一点点中介费。 image.png

三、总结

优点:降低了对象的耦合性,使对象之间的一对多关系变成了一对一,提高了系统的灵活性。

缺点:如果需要相互关联的对象很多时,就会导致中介类显得庞大。

中介者模式的角色:

  1. 抽象同事类:主要是规范同事类,同时也包含一些公共的方法。
  2. 具体同事类:抽象同事类的实现。
  3. 抽象中介者:定义同事对象的注册接口以及同事类通信的方法。
  4. 具体中介者:定义一个集合管理同事对象,实现同事对象之间的交互。

ps:广义中介者模式:上述的例子中,我们需要定义抽象同事类进行约束,但很多情况下同事类是没有关系的,所以我们可以使用广义的中介者模式,不需要定义抽象中介者,把中介者定义为单例,同事对象不在直接持有中介者对象,直接调用中介者对象的方法,中介者对象也不再持有同事对象,在需要的时候创建,或者通过参数传递,中介者对象根据业务提供相应的通知方法。