前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >趣解设计模式之《为什么租房子要找中介?》

趣解设计模式之《为什么租房子要找中介?》

原创
作者头像
爪哇缪斯
发布于 2023-09-12 02:10:58
发布于 2023-09-12 02:10:58
19700
代码可运行
举报
文章被收录于专栏:爪哇缪斯爪哇缪斯
运行总次数:0
代码可运行

〇、小故事

小王大学毕业了,打算来北京闯荡一下,于是就先寄宿到了他的表姐家,白天的时候,自己在外面小区转一转,看看能不能找到可以租到的房子,他找了好几天都没有找到合适的,要么就是小区里一张租房子的广告都没有,好不容易找到几个,里面的房间大小和价格又不合适。北京实在是太大了,而且这边人生地不熟的,找房子真的是耗费了他大量的力气。

到了周末,表姐问他这几天都在干嘛,他告诉了表姐自己找房子的经历,表姐跟他说,明天姐带你去找中介,这个事儿好办。第二天,小王和表姐到了某中介公司,跟中介表明自己需要寻找什么样的房子——主卧还是次卧屋子面积多少平米是否向阳房子在哪个区域内押金是多少…… 根据这些条件,中介给小王列出了好几个房源,然后就带着他们去看房,很快小王就找到了自己心仪的房子了

那么,上面的故事也是很多北漂人比较熟悉的经历吧。那么,对于房东和租客来说,中介人员就属于一个中间层,房东们与中介联系,将自己待出租的房子录入中介系统中,而访客又会通过中介去找房子,对于房子信息的采集,归类,降价,涨价,下架,匹配……这一系列工作都由中介人员去做,这样既使得房东很轻松,不用一次次对接房客,一遍遍的介绍自己的房子;也使得房客很轻松,直接通过中介系统就可以过滤出符合自己的房子,然后直奔目标,不用像个无头苍蝇一般的在各个小区乱碰运气的找房子。那么这个就是我们今天要介绍的设计模式——中介者模式

一、模式定义

中介者模式Mediator Pattern

使用中介者模式来集中相关对象之间复杂的沟通和控制方式。

为了便于理解,我们再举一个系统设计上的例子。在网上售卖商城的系统中,存在三个功能,分别为采购功能销售功能库存功能

采购功能】需要从销售功能获取到销售情况,并且确定是否要继续采购增加库存量。 【销售功能】要获得库存信息,并且销售量大于库存量,则需要通知采购功能快速采购商品。并且每当销售了产品后,需要扣减库存。 【库存功能】如果库存压力大了,要提示销售功能去折价促销,尽快消耗库存,并且通知采购功能暂时不要进行该商品的采购行为。

通过上面的描述,我们应该可以看到,采购销售库存这三个业务域是互相依赖的,如下图所示:

那么如果依照这种关联关系进行开发的话,就会出现这三个功能相互耦合的情况。如果需求变更了,会产生牵一发而动全身的情况发生。无形之中增加了业务开发量。那么针对这种情况,我们可以采取中介者模式或者叫做调停者模式。如下所示:

根据最小知识原则,无论是采购、销售还是库存,在他们眼中,最亲密的朋友都是这个中介者。而中介者将所有的业务逻辑关系进行整合,只需要这三个业务域提供针对他们自己业务的操作接口接口,后续如果需求变更,大概率涉及到修改的也都是在中介者

二、模式类图

针对上面讲的网上售卖商城例子,我们来画一下类的关系图。首先,创建3个类分别为Purchase采购人员)、Sale销售人员)和Stock库存人员),其次,创建一个抽象的同事类AbstractColleague,让刚刚创建的这3种人员都继承这个抽象类,该抽象类没有抽象方法需要子类实现,只是禁止本类被实例化成对象。在该抽象类中,引用了一个中介者类Mediator,该类引用了Purchase、Sale和Stock这三种工作人员,并且把他们的调用逻辑抽取出来放到中介者类中。请见下图所示:

三、代码实现

创建抽象同事类,并引用中介者Mediator的实例对象AbstractColleague.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public abstract class AbstractColleague {
    protected Mediator mediator;
    public AbstractColleague(Mediator mediator) {
        this.mediator = mediator;
    }
}

创建采购人员Purchase.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Purchase extends AbstractColleague {
    public Purchase(Mediator mediator) {
        super(mediator);
    }

    /** 采购电脑 */
    public void buyComputer(int num) {
        System.out.println();
        super.mediator.purchaseByComputer(num);
    }

    /** 不再采购电脑 */
    public void refuseBuyComputer() {
        System.out.println("不再采购电脑!");
    }
}

创建销售人员Sale.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Sale extends AbstractColleague {
    public Sale(Mediator mediator) {
        super(mediator);
    }

    /** 销售电脑 */
    public void sellComputer(int number) {
        super.mediator.saleSellComputer(number);
        System.out.println("销售电脑" + number + "台");
    }

    /** 获得销售情况(即:售卖了多少台电脑) */
    public int getSaleStatus() {
        // 模拟销售数量
        int sellNumber = new Random(System.currentTimeMillis()).nextInt(100);
        System.out.println("电脑的销售情况为:" + sellNumber + "台");
        return sellNumber;
    }

    /** 折价处理 */
    public void offSale() {
        super.mediator.saleOffSale();
    }
}

创建库存人员Stock.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Stock extends AbstractColleague {
    private static int COMPUTER_NUM = 100;

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

    /** 增加库存 */
    public void increaseComputer(int number) {
        COMPUTER_NUM += number;
        System.out.println("电脑的库存数量为:" + COMPUTER_NUM);
    }

    /** 减少库存 */
    public void decreaseComputer(int number) {
        COMPUTER_NUM -= number;
        System.out.println("电脑的库存数量为:" + COMPUTER_NUM);
    }

    /** 获得当前库存 */
    public int getStockNumber() {
        return COMPUTER_NUM;
    }

    /** 清理库存 */
    public void clearStock() {
        System.out.println("清理库存数量为:" + COMPUTER_NUM);
        super.mediator.stockClear();
    }
}

创建中介者Mediator.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Mediator {
    protected Purchase purchase; // 采购人员
    protected Sale sale; // 销售人员
    protected Stock stock; // 库存人员

    public Mediator() {
        purchase = new Purchase(this);
        sale = new Sale(this);
        stock = new Stock(this);
    }

    /** 采购电脑 */
    public void purchaseByComputer(int num) {
        int saleStatus = sale.getSaleStatus();
        // 如果销售情况不好(即:没有超过80台),则采购总数减半
        String msg = "";
        if (saleStatus <= 80) {
            num = num / 2;
            msg = "由于销售不佳,采购总数减半,";
        }
        System.out.println(msg + "原有库存电脑" + stock.getStockNumber() + "台,现采购电脑" + num + "台");
        stock.increaseComputer(num);
    }

    /** 销售电脑 */
    public void saleSellComputer(int num) {
        // 如果库存数量不足,则采购2倍的num电脑数,暂时只售卖库存中有的数量
        int stockNum;
        if ((stockNum = stock.getStockNumber()) < num) {
            purchase.buyComputer(2*num);
            num = stockNum;
        }
        stock.decreaseComputer(num);
    }

    /** 折价销售电脑 */
    public void saleOffSale() {
        System.out.println("折价销售电脑");
    }

    /** 清理库存 */
    public void stockClear() {
        sale.offSale(); // 折价销售电脑
        purchase.refuseBuyComputer(); // 不要采购电脑
    }
}

创建测试类MediatorTest.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MediatorTest {
    public static void main(String[] args) {
        Mediator mediator = new Mediator();
        System.out.println("--------采购人员采购电脑--------");
        Purchase purchase = new Purchase(mediator);
        purchase.buyComputer(100);

        System.out.println("--------销售人员销售电脑--------");
        Sale sale = new Sale(mediator);
        sale.sellComputer(1);

        System.out.println("--------库房人员清库处理--------");
        Stock stock = new Stock(mediator);
        stock.clearStock();
    }
}

执行结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--------采购人员采购电脑--------

电脑的销售情况为:36台
由于销售不佳,采购总数减半,原有库存电脑100台,现采购电脑50台
电脑的库存数量为:150
--------销售人员销售电脑--------
电脑的库存数量为:149
销售电脑1--------库房人员清库处理--------
清理库存数量为:149
折价销售电脑
不再采购电脑!

Process finished with exit code 0

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
趣解设计模式之《为什么租房子要找中介?》
小王大学毕业了,打算来北京闯荡一下,于是就先寄宿到了他的表姐家,白天的时候,自己在外面小区转一转,看看能不能找到可以租到的房子,他找了好几天都没有找到合适的,要么就是小区里一张租房子的广告都没有,好不容易找到几个,里面的房间大小和价格又不合适。北京实在是太大了,而且这边人生地不熟的,找房子真的是耗费了他大量的力气。
爪哇缪斯
2023/10/06
1780
趣解设计模式之《为什么租房子要找中介?》
设计模式—— 十四 :中介者模式
● Mediator(抽象中介者):它定义一个接口,该接口用于与各同事对象之间进行通信。 ● ConcreteMediator(具体中介者):它是抽象中介者的子类,通过协调各个同事对象来实现 协作行为,它维持了对各个同事对象的引用。 ● Colleague(抽象同事类):它定义各个同事类公有的方法,并声明了一些抽象方法来供子类 实现,同时它维持了一个对抽象中介者类的引用,其子类可以通过该引用来与中介者通信。 ● ConcreteColleague(具体同事类):它是抽象同事类的子类;每一个同事对象在需要和其他同事对象通信时,先与中介者通信,通过中介者来间接完成与其他同事类的通信;在具体同事类中实现了在抽象同事类中声明的抽象方法。。每个同事类的行为分为两种:一种是同事本身的行为,比如改变对象本身的 状态,处理自己的行为等,这种行为叫做自发行为(Self-Method),与其他的同事类或中介 者没有任何的依赖;第二种是必须依赖中介者才能完成的行为,叫做依赖方法(Dep- Method)。
三分恶
2020/07/16
5650
Java中介者设计模式
中介者设计模式是一种非常常见的设计模式,其中我们最为熟悉的就是我们的MVC框架,其中的C作为控制器就是一个具体的中介者,它的作用是把业务逻辑(Model),和视图(Viwe)隔离开来,使M V协调工作,把M运行的的结果和V代表的视图融合成一个前端可以展示的页面,减少M 和V的依赖关系,现在MVC框架也是一个非常成熟的框架,这也是中介者模式优点的一个体现。
用户5166556
2019/04/16
4380
Java中介者设计模式
设计模式-行为型模式-中介者模式
该Purchase定义了采购电脑的标准。根据电脑的销售情况,往库存里放入产品。如果销售不好,则折半销售。
mySoul
2018/12/02
5340
【万字图文】详解设计模式(上篇)
本阶段会陆续的用两篇文章讲解23种设计模式中的22种,因为解释器模式在实际应用中使用较少,更偏重于在语言中解释器上面的应用,所以这个模式就没有详细的展开。文章中主要参考《Head First设计模式》、《设计模式之禅》还有相关网上文章的总和。希望能叙述清楚每种模式的特点和应用场景。如下为本篇文章的大纲。 〇、前提基础
爪哇缪斯
2023/05/10
6630
【万字图文】详解设计模式(上篇)
设计模式实战 - 中介者模式
以终端销售商(以服务最终客户为目标的企业,如超市)为例,采购部门要采购IBM的电脑,它根据以下两个要素来决定采购数量。
JavaEdge
2018/12/19
8601
设计模式实战 - 中介者模式
中介者模式
概念 中介者模式:用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互 结构组成和类图 类图: 中介者模式主要由:Me
xiangzhihong
2018/02/06
4880
中介者模式
设计模式-中介者模式
随着汽车越来越普及了,很多家庭配置了汽车,其实很多是闲置状态,也只是代代步,但是为了方便出门提升司机们的收入,滴滴推出了顺风车服务,乘客和司机大哥发布的信息双方在平台上面都可以收到,这个跟设计模式中的中介者模式类似,平台是中介、司机和乘客是同事角色。
逍遥壮士
2020/09/18
6710
设计模式-中介者模式
中介者模式
也叫调停者模式,顾名思义,是一个中间人。多个类之间需要相互交互,难以管理,将结构改成星形,所有的交互全都交给中介去管理。
三流之路
2022/10/04
2880
java设计模式之中介者模式
中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。
用户4361942
2019/05/24
6610
详解设计模式:中介者模式
中介者模式(Mediator Pattern)也被称为调停者模式,是在 GoF 23 种设计模式中定义了的行为型模式。
栗筝i
2022/12/07
7140
详解设计模式:中介者模式
Java经典设计模式之十一种行为型模式(附实例和详解)
Java经典设计模式共有21中,分为三大类:创建型模式(5种)、结构型模式(7种)和行为型模式(11种)。
全栈程序员站长
2022/06/29
3580
Java经典设计模式之十一种行为型模式(附实例和详解)
设计模式 | 中介者模式及典型应用
世界上存在着各种各样的数据库,不同数据库有各自的应用场景,对于同一份数据,最开始可能使用关系型数据库(如MySQL)进行存储查询,使用Redis作为缓存数据库,当数据量较大时使用MySQL进行查询可能较慢,所以需要将数据同步到Elasticsearch或者列式数据库如Hbase中进行大数据查询。
小旋锋
2019/01/21
1.3K0
设计模式学习之中介者模式
我们平时写代码的过程,一个类必然会与其他类产生依赖关系,如果这种依赖关系如网状般错综复杂,那么必然会影响我们的代码逻辑以及执行效率,适当地使用中介者模式可以对这种依赖关系进行解耦使逻辑结构清晰,本篇博客,我们就一起学习中介者模式。
老马的编程之旅
2022/06/22
2120
设计模式学习之中介者模式
设计模式(十九):行为型之中介者模式
冬天vs不冷
2025/01/21
1020
设计模式(十九):行为型之中介者模式
Java设计模式-中介者模式
一般来说,同事类之间的关系是比较复杂的,多个同事类之间互相关联时,他们之间的关系会呈现为复杂的网状结构,这是一种过度耦合的架构,即不利于类的复用,也不稳定。例如在下左图中,有六个同事类对象,假如对象1发生变化,那么将会有4个对象受到影响。如果对象2发生变化,那么将会有5个对象受到影响。也就是说,同事类之间直接关联的设计是不好的。
宁在春
2022/10/31
5890
Java设计模式-中介者模式
设计模式---中介者模式
一般来说,同事类之间的关系是比较复杂的,多个同事类之间互相关联时,他们之间的关系会呈现为复杂的网状结构,这是一种过度耦合的架构,即不利于类的复用,也不稳定。例如在下图中,有六个同事类对象,假如对象1发生变化,那么将会有4个对象受到影响。如果对象2发生变化,那么将会有5个对象受到影响。也就是说,同事类之间直接关联的设计是不好的。
大忽悠爱学习
2021/11/15
2470
Java设计模式之中介者模式
基本介绍 中介者模式(Mediator Pattern),用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显式地相互引用, 从而使其耦合松散,而且可以独立地改变它们之间的交互 中介者模式属于行为型模式,使代码易于维护 比如MVC模式,C(Controller控制器)是M(Model模型)和V(View视图)的中介者,在前后端交互时起到了中间人的作用 Mediator就是抽象中介者,定义了同事对象到中介者对象的接口 Colleague是抽象同事类 Concretemediato
shaoshaossm
2022/12/27
2210
Java设计模式之中介者模式
设计模式之中介者模式(行为型)
中介者模式(Mediator Pattern):中介者模式就是用一个中介对象来封装一系列的对象的交互,使各对象之间不需要显式地相互作用,降低对象之间的耦合度,中介者是一种对象行为型模式。
SmileNicky
2019/04/22
4170
中介者模式--各部门的协作
小帅在一家制造业企业工作,他所在的生产部门负责产品的的生产。由于他们公司的产品都是定制化的,都是根据销售部门的订单生产,在生产的过程中还要检查仓库里的原材料是否充足。
zhanyd
2022/05/16
4090
中介者模式--各部门的协作
相关推荐
趣解设计模式之《为什么租房子要找中介?》
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验