java 设计模式之中介者模式(十七)

207 阅读4分钟

java 设计模式之中介者模式①⑦

.我们总是喜欢拿顺其自然来敷衍人生道路上的荆棘坎坷,却很少承认,真正的顺其自然,其实是竭尽所能之后的不强求,而非两手一摊的不作为。

设计模式学习,近期我会把23种设计模式都写成博客,敬请期待~
—2021/1/23

定义

用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互。

百度百科

经典案例

房东 --> 中介 --> 租客 生活案例举例

比如58同城租房,房东需要吧需要出租的房屋信息提交到58同城,

租客需要去58同城上挑选自己中意的房屋来组,期间房东与租客不会交互,会通过中介来交互

假设有5个房东,需要出租5套房子,那么租客就只能在这5套中挑选合适的.

角色分析

UML类图分析(1.1):
在这里插入图片描述

  • Mediator:抽象中介者:定义好同事类对象到中介者对象的接口,用于各个同事类之间的通信。一般包括一个或几个抽象的事件方法,并由子类去实现。
  • ConcreateMediator:中介者实现类:继承自抽象中介者,实现抽象中介者中定义的事件方法。
  • House:同事抽象类:吧抽象中介则聚合进来,用来规范具体实现
  • MasterHouse / TenantHouse : 同事类: 实现同时抽象类方法,用于实现各自的需求

为什么这里要叫同事类?
出租与租,都是一种需求,而且他们都委托给中介来管理,从某种意义上来说,也算是’同事’

代码实现

Mediator中介者抽象类:

public abstract class Mediator {

    //TODO 房东
    public abstract void registerMasterHouse(House house);

    //移除房东
    public abstract void removeMasterHouse(House house);


    //租客 注册
    public abstract void registerTenantHouse(House house);

    //移除租客
    public abstract void removeTenantHouse(House house);
}

House房屋抽象类:

public abstract class House {
    //中介者抽象类
    public Mediator mediator;

    public House(Mediator mediator) {
        this.mediator = mediator;
    }
    //输出消息
    public abstract void sendInfo(String  info);

    //获取房东发送的消息 (打印消息时使用)
    protected abstract String getInfo();
}

中介者具体实现:

public class ConcreateMediator extends Mediator {

    //房东
    private final ArrayList<House> masterList;

    //租客
    private final ArrayList<House> tenantList;

    public ConcreateMediator() {
        masterList = new ArrayList<>();
        tenantList = new ArrayList<>();
    }


    @Override//房东注册房子
    public void registerMasterHouse(House house) {
        masterList.add(house);
    }

    @Override//房东移除房子
    public void removeMasterHouse(House house) {
        if (masterList.contains(house)) {
            masterList.remove(house);
        }
    }

    /**
     * 打印房东消息
     */
    public void printMasterHouse(){
        Iterator<House> iterator = masterList.iterator();
        while (iterator.hasNext()){
            House next = iterator.next();
            Log.i("中介者模式:","房东消息 :"+  next.getInfo());
        }
    }

    @Override//租客 租房子
    public void registerTenantHouse(House house) {
        tenantList.add(house);
    }

    @Override//租客移除房子
    public void removeTenantHouse(House house) {
        if (tenantList.contains(house)) {
            tenantList.remove(house);
        }
    }
    /**
     * 打印租客消息
     */
    public void printTenantHouse(){
        Iterator<House> iterator = tenantList.iterator();
        while (iterator.hasNext()){
            House next = iterator.next();
            Log.i("中介者模式:","租客消息 :"+  next.getInfo());
        }
    }
}

MasterHouse 房东具体实现:

public class MasterHouse extends House{

    private String msg = "";

    public MasterHouse(Mediator mediator) {
        super(mediator);
    }

    @Override
    public void sendInfo(String info) {
        this.msg = info;
        mediator.registerMasterHouse(this);
    }

    @Override
    protected String getInfo() {
        return msg;
    }
}

分析:

  • 这里在发送消息的时候,通过调用父类中介者的注册方法,将当前状态添加到中介者的’房东’集合中; (便于之后打印,而且使用集合方便管理)
    在这里插入图片描述

租客实现类:

public class TenantHouse extends House {
    private String msg = "";



    public TenantHouse(Mediator mediator) {
        super(mediator);
    }

    @Override
    public void sendInfo(String info) {
        msg = info;
        mediator.registerTenantHouse(this);
    }
    @Override
    public String getInfo() {
        return msg;
    }
}

测试代码(客户端):

房东测试:

	   //中介者
        ConcreateMediator concreateMediator = new ConcreateMediator();

        //房东 吧房子交给中介者
        MasterHouse masterHouse = new MasterHouse(concreateMediator);
        MasterHouse masterHouse2 = new MasterHouse(concreateMediator);
        MasterHouse masterHouse3 = new MasterHouse(concreateMediator);

        //房东发送消息
        masterHouse.sendInfo("北京市丰台区丰台接到幸福小区1单元1号楼 2000/月 ");
        masterHouse2.sendInfo("北京市丰台区丰台接到幸福小区1单元1号楼 4000/月 ");
        masterHouse3.sendInfo("北京市丰台区丰台接到幸福小区1单元1号楼 6000/月 ");

        //删除房东3 的消息
        concreateMediator.removeMasterHouse(masterHouse3);

        //打印租客发送的消息
        concreateMediator.printMasterHouse();

Log图(2.1):
在这里插入图片描述
租客测试:

		//租客
        TenantHouse tenantHouse = new TenantHouse(concreateMediator);

        //租客租房子
        tenantHouse.sendInfo("我想在丰台租一个一室一厅1000 - 1500元/月,年初去北京发展很急!");
        //打印租客发送的消息
        concreateMediator.printTenantHouse();

Log图(2.2):
在这里插入图片描述

如何扩展

假设我现在租房对性别要求,我是女生,我要和女生合租

WomanHouse女性租客具体实现:

public class WomanHouse extends House {
    private String msg;

    public WomanHouse(Mediator mediator) {
        super(mediator);
    }

    @Override
    public void sendInfo(String info) {
        msg = info;
        mediator.registerTenantHouse(this);
    }

    @Override
    protected String getInfo() {
        return msg;
    }
}

测试代码(客户端):

//女性租客
WomanHouse womanHouse = new WomanHouse(concreateMediator);

womanHouse.sendInfo("我是女性,我想在丰台区和女性合租, 1300/月");
        //打印租客发送的消息
concreateMediator.printTenantHouse();

Log图(2.3):
在这里插入图片描述

优点:

  • 适当地使用中介者模式可以避免同事类之间的过度耦合,使得各同事类之间可以相对独立地使用。
  • 使用中介者模式可以将对象间一对多的关联转变为一对一的关联,使对象间的关系易于理解和维护。

完整代码

去设计模式主页

原创不易,您的点赞就是对我最大的支持哦~