「这是我参与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();
}
}
此处就是一个典型的通过中介买车的问题了,中介的确省去了我们自己寻找卖家的过程,但是可能会有一点点中介费。
三、总结
优点:降低了对象的耦合性,使对象之间的一对多关系变成了一对一,提高了系统的灵活性。
缺点:如果需要相互关联的对象很多时,就会导致中介类显得庞大。
中介者模式的角色:
- 抽象同事类:主要是规范同事类,同时也包含一些公共的方法。
- 具体同事类:抽象同事类的实现。
- 抽象中介者:定义同事对象的注册接口以及同事类通信的方法。
- 具体中介者:定义一个集合管理同事对象,实现同事对象之间的交互。
ps:广义中介者模式:上述的例子中,我们需要定义抽象同事类进行约束,但很多情况下同事类是没有关系的,所以我们可以使用广义的中介者模式,不需要定义抽象中介者,把中介者定义为单例,同事对象不在直接持有中介者对象,直接调用中介者对象的方法,中介者对象也不再持有同事对象,在需要的时候创建,或者通过参数传递,中介者对象根据业务提供相应的通知方法。