中介者模式的设计思想【行为型】

中介者模式是一种行为型模式【迪米特法则的典型应用】

在生活中,当我们租房获取房源信息,假设是房东直接和租户联系,那么,当某一个房东有房源信息时,就需要通知所有的租户当某一个人需要租房时租房时,就要就要咨询每一个房东相关房源信息,这样子一个发生变化时,很多都会发生变化。这个时候就可以想想可不可以有一个房屋中介,所有房东将所有的房源信息告诉中介,这样子当有租客想要租房时直接找房屋中介,就可以获取所有的房源信息了。就不需要咨询每一个房东了。

同样的,当某个房东有新的房源信息时,就可以直接告诉房屋中介,就不需要一次告诉所有的需要租房的人了。

中介者模式的组成部分:

  • 抽象中介者(Mediator):定义了中介者对象的接口,负责定义对象间的通信协议。

  • 具体中介者(Concrete Mediator):实现了中介者接口,负责协调各个同事对象之间的交互关系。

  • 抽象同事类(Colleague):定义了同事对象的接口,负责定义对象间的行为。

  • 具体同事类(Concrete Colleague):实现了同事接口,负责实现具体的行为。

在租房案例中:

  • 抽象中介者:就是中介这个概念,有发布房源信息的方法

  • 具体中介者:实例一个抽象中介者

  • 抽象同事:人,房东和租房人员的概念

  • 具体同事:指具体的房东或者具体的租客

具体代码实现:

1、创建抽象工作者

/**
 * 抽象中介者,提供发布房源信息和需要房源信息的方法
 **/
public interface Mediator {
​
    void publicHouse(String message);
​
    void needHouse(String message);
}

2、创建抽象同事类【Person】,抽象同事有名字,有自己注册到哪一个中介公司中,所以需要聚合抽象中介者。

/**
 * 抽象同事
 **/
public abstract class Person {
​
    private String name;
​
    /**
     * 在抽象同事中聚合抽象中介者
     **/
    private Mediator mediator;
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public Mediator getMediator() {
        return mediator;
    }
​
    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
    }
​
    public Person(String name) {
        this.name = name;
    }
​
​
    /**
     * 发布信息抽象方法,具体的实现有继承的具体同事声明
     **/
    public abstract void fabuxinxi(String msg);
}

3、创建具体同事,房东【HouseOwner】和租户【Tenant】,具体同事实现抽象同事,实现发布信息先后向方法。在发布信息方法中使用自己的中介者信息发布相关具体信息。

public class HouseOwner extends Person{
    public HouseOwner(String name) {
        super(name);
    }
​
    /**
     * 房东发布房源信息
     **/
    @Override
    public void fabuxinxi(String msg) {
        getMediator().publicHouse(msg);
    }
​
    /**
     * 中介者通知房东有租户想租房了
     * @param message 租户房屋需求
     **/
    public void contact(String message){
        System.out.println("中介通知房东," + getName() + ":" + message);
    }
}
​
​
public class Tenant extends Person {
​
​
    public Tenant(String name) {
        super(name);
    }
​
    /**
     * 租户发布租房需求
     **/
    @Override
    public void fabuxinxi(String msg) {
        getMediator().needHouse(msg);
    }
​
    /**
     * 中介者通知租户有房源信息了
     * @param message 房源信息
     **/
    public void contact(String message) {
        System.out.println("中介通知租户," + getName() + ":" + message);
    }
}

4、创建具体中介者信息,中介者有消息时需要通知房东或者租户,所以需要将房东和租户聚合到中介者中。

/**
 * 具体中介者
 **/
public class MediatorObject implements Mediator {
​
    private List<HouseOwner> houseOwners = new ArrayList<>();
    private List<Tenant> tenants = new ArrayList<>();
​
    public MediatorObject() {
    }
​
    /**
     * 向中介注册房东信息
     **/
    public void setHouseOwners(HouseOwner... houseOwner) {
        this.houseOwners.addAll(Arrays.asList(houseOwner));
    }
​
    /**
     * 向中介注册租客信息
     **/
    public void setTenants(Tenant... tenant) {
        this.tenants.addAll(Arrays.asList(tenant));
    }
​
    /**
     * 中介发布房屋信息时,就向所有的租客传递房源信息
     **/
    @Override
    public void publicHouse(String message) {
        if (!this.tenants.isEmpty()) {
            for (Tenant tenant : this.tenants) {
                tenant.contact(message);
            }
        }
    }
​
    /**
     * 当有人需要房子时,中介就向所有的房东传递信息
     **/
    @Override
    public void needHouse(String message) {
        if (!this.houseOwners.isEmpty()) {
            for (HouseOwner owner : this.houseOwners) {
                owner.contact(message);
            }
        }
    }
}

5、测试

public static void main(String[] args) {
    //创建一个中介者
    MediatorObject mediator = new MediatorObject();
    //创建两个房东信息
    HouseOwner houseOwner1 = new HouseOwner("房东1");
    HouseOwner houseOwner2 = new HouseOwner("房东2");
​
    //创建三个租户信息
    Tenant tenant1 = new Tenant("租户1");
    Tenant tenant2 = new Tenant("租户2");
    Tenant tenant3 = new Tenant("租户3");
​
    //向中介者添加房东信息
    mediator.setHouseOwners(houseOwner1, houseOwner2);
    //向中介者添加租户信息
    mediator.setTenants(tenant1, tenant2, tenant3);
    //中介者发布房源信息,会依次通知每一个租户
    mediator.publicHouse("在清水河有一个一居室,500元 每月");
    //中介者发布租户需求,会依次通知每一个房东
    mediator.needHouse("我需要一个清水河的房子");
​
}
​
//测试结果
中介通知租户,租户1:在清水河有一个一居室,500元 每月
中介通知租户,租户2:在清水河有一个一居室,500元 每月
中介通知租户,租户3:在清水河有一个一居室,500元 每月
中介通知房东,房东1:我需要一个清水河的房子
中介通知房东,房东2:我需要一个清水河的房子
​
Process finished with exit code 0

在案例中,当用户需要房子时,告诉中介者,中介者发布一个需要房子信息,那么就可以告诉所有的房东了。

可以看中中介者模式和观察者模式是非常像的。就一个单项一个双向。

查看具体区别请见:【模式对比】观察者模式 VS 中介者模式 - 知乎

有关观察者模式更多细节请见:【行为型-3】设计模式之-观察者模式 - 知乎

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值