中介者模式

一句话定义

在多个对象关系交错复杂的情况中,提供中介类进行关系处理,降低类之间的耦合

使用场景

1. 多个类关系复杂、交错
2. 使用中间类进行处理,形成星状结构

实现要点

1. 将所有交互集中到中介者
2. 交互对象不互相依赖

情景假设

张三趁着房价上涨买房,新房限购只能购买暂时不限购的二手房,同时委托中介进行处理,中介就需要处理购房者、卖房者(李四)、贷款银行三者的交互,而三者不互相交互,所有的相关事宜全部交给中介进行处理。

设定:
    张三:买房;获得房子
    银行:发放贷款;收取房贷
    李四:收钱;拿出房产证

实现步骤

1. 首先创建抽象Colleague对象。包括买家、卖家、银行。
package com.example.ffengz.designmode.mediator;

/**
 * 抽象买家
 *
 * @author fengzhen
 * @version 1.0, 2017/3/29
 */
public abstract class Buyer {
    // 委托的中介
    protected Mediator mMediator;

    /**
     * 绑定中介者
     */
    public Buyer(Mediator mediator) {
        this.mMediator = mediator;
    }

    /**
     * 买房
     */
    abstract void buyHouse();

    /**
     * 得到房产证
     */
    abstract void getHouse();
}
package com.example.ffengz.designmode.mediator;

/**
 * 抽象卖家
 *
 * @author fengzhen
 * @version 1.0, 2017/3/29
 */
public abstract class Seller {
    // 委托的中介
    protected Mediator mMediator;

    /**
     * 绑定中介者
     */
    public Seller(Mediator mediator) {
        this.mMediator = mediator;
    }

    /**
     * 收钱
     */
    abstract void getMoney();

    /**
     * 付出房产证
     */
    abstract void giveHouse();
}
package com.example.ffengz.designmode.mediator;

/**
 * 抽象银行
 * 这里假设银行与客户也不直接交互,不等同于现实情况
 *
 * @author fengzhen
 * @version 1.0, 2017/3/29
 */
public abstract class Bank {
    // 委托的中介
    protected Mediator mMediator;

    /**
     * 绑定中介者
     */
    public Bank(Mediator mediator) {
        this.mMediator = mediator;
    }

    /**
     * 贷款
     */
    abstract void lending();

    /**
     * 获取月供
     */
    abstract void getMonthlyMoney();
}
2. 创建具体的买家:张三
package com.example.ffengz.designmode.mediator;

import android.util.Log;

/**
 * 张三买房者
 *
 * @author fengzhen
 * @version 1.0, 2017/3/29
 */
public class Z3Buyer extends Buyer{
    /**
     * 绑定中介者
     *
     * @param mediator
     */
    public Z3Buyer(Mediator mediator) {
        super(mediator);
    }

    @Override
    public void buyHouse() {
        Log.i("info", "buyHouse: 张三买房");
        Log.i("info", "buyHouse: 张三给首付");
        mMediator.change(this);
    }

    @Override
    void getHouse() {
        Log.i("info", "buyHouse: 张三获得房子");
        Log.i("info", "buyHouse: 张三给房贷");
    }
}
3. 创建具体的卖家:李四
package com.example.ffengz.designmode.mediator;

import android.util.Log;

/**
 * 李四 卖房者
 *
 * @author fengzhen
 * @version 1.0, 2017/3/29
 */
public class L4Seller extends Seller{
    /**
     * 绑定中介者
     *
     * @param mediator
     */
    public L4Seller(Mediator mediator) {
        super(mediator);
    }

    @Override
    void getMoney() {
        Log.i("info", "buyHouse: 李四获得全款");
    }

    @Override
    void giveHouse() {
        Log.i("info", "buyHouse: 李四交出房子");
        mMediator.change(this);
    }
}
4. 创建中介者对象。
package com.example.ffengz.designmode.mediator;

import android.util.Log;

/**
 * 抽象中介者
 *
 * @author fengzhen
 * @version 1.0, 2017/3/29
 */
public class Mediator {
    private Buyer mBuyer;
    private Seller mSeller;
    private Bank mBank;

    public void setmBuyer(Buyer mBuyer) {
        this.mBuyer = mBuyer;
    }

    public void setmSeller(Seller mSeller) {
        this.mSeller = mSeller;
    }

    public void setmBank(Bank mBank) {
        this.mBank = mBank;
    }

    public void change(Bank bank){
        mSeller.getMoney();
        mSeller.giveHouse();
    }

    public void change(Buyer buyer){
        mBank.lending();
    }

    public void change(Seller seller){
        mBuyer.getHouse();
        mBank.getMonthlyMoney();
    }
}
5. 进行购房流程
        // 中间者模式
        Mediator mediator = new Mediator();
        Z3Buyer z3Buyer = new Z3Buyer(mediator);
        L4Seller l4Seller = new L4Seller(mediator);
        CenterBank centerBank = new CenterBank(mediator);
        // 对象设置
        mediator.setmBuyer(z3Buyer);
        mediator.setmSeller(l4Seller);
        mediator.setmBank(centerBank);
        // 张三买房
        z3Buyer.buyHouse();
6. 结果展示
03-29 17:04:12.405 8170-8170/com.example.ffengz.designmode I/info: buyHouse: 张三买房
03-29 17:04:12.943 8170-8170/com.example.ffengz.designmode I/info: buyHouse: 张三给首付
03-29 17:04:19.043 8170-8170/com.example.ffengz.designmode I/info: buyHouse: 银行放贷
03-29 17:04:19.720 8170-8170/com.example.ffengz.designmode I/info: buyHouse: 李四获得全款
03-29 17:04:19.720 8170-8170/com.example.ffengz.designmode I/info: buyHouse: 李四交出房子
03-29 17:04:19.720 8170-8170/com.example.ffengz.designmode I/info: buyHouse: 张三获得房子
03-29 17:04:19.720 8170-8170/com.example.ffengz.designmode I/info: buyHouse: 张三给房贷
03-29 17:04:19.721 8170-8170/com.example.ffengz.designmode I/info: buyHouse: 得到月供

优缺点

通过例子可以看出,使用终结者模式优缺点。将复杂、高耦合整合到终结者中,每个Colleage对象只用关注自己的流程交互,然后通知中介者状态发生改变,统一通过终结者进行各个流程的续接交互。
将多个对象的网状结构改成星状结构,方便理解,同时降低耦合度。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值