设计模式(十二):中介者模式(行为型模式)

Mediator,中介者模式:用一个中介对象封装一些列的对象交互。属于行为型模式

Facade,外观模式:为子系统中的一组接口提供一致的界面,facade

提供了一高层接口,这个接口使得子系统更容易使用。属于结构型模式

两者其实挺像,但是外观模式更多的是把一系列过程封装在一个外观类,比如下单,支付,增加积分几个服务封装在一个外观类,客户端直接调用这个外观类的一个方法即可,就不用依次去调用了各个服务了,参考设计模式(五):外观模式(结构型模式)

而中介者模式,中介者负责消息的传递,解耦客户端对象和服务端对象各个接口的交互。

中介者全程参与交易过程,而外观模式外观类只是负责封装各个子系统的接口。不直接参与交易。

下面举例房地产中介参与房子买卖过程。

试想,如果没有中介者参与其中,买房者需要挨家挨户去敲门,你们家卖房子不?卖多少钱?很多人是不卖房的,你会吃闭门羹,你(客户端对象)和房东(服务端对象)之间是紧密耦合的,有了中介,他事先帮你把房地产信息收集好了。他可以主动去联系房东,或者房东主动去他们店挂牌。你只需要联系中介就可以了。说出你的需求,中介帮你匹配房源,促成你和房东之间的交易即可。你只需要和中介一个人耦合即可,和房东们之间松耦合。

类图:

上代码:

房东:

java 复制代码
package com.figo.study2024.pattern.mediator;

/**
 * @ClassName:Landlord
 * @PackageName:com.figo.study2024.pattern.mediator
 * @Description:房东基类
 * @Date:2024/3/21 20:40
 * @Author:figo
 */
public abstract class Landlord {
    private Mediator mediator;
    public Landlord(Mediator mediator)
    {
        this.mediator=mediator;
    }
    public Mediator getMediator() {
        return mediator;
    }
    /**
     * 满足条件,签合同
     * @return
     */
    public abstract boolean signContract(int price);

}



package com.figo.study2024.pattern.mediator;

/**
 * @ClassName:SmallHouseLandlord
 * @PackageName:com.figo.study2024.pattern.mediator
 * @Description:小房子房东具体类
 * @Date:2024/3/21 20:44
 * @Author:figo
 */
public class SmallHouseLandlord extends Landlord{
    public SmallHouseLandlord(Mediator mediator) {
        super(mediator);
        //直接往中介处注册
        mediator.register("smallHouseLandloard1",this);
    }

    @Override
    public boolean signContract(int price) {
        if(price>=200)
        {
            System.out.println("大于200万,我家房子出售,来赶紧签合同!");
            return true;
        }else {
            System.out.println("小于200万,我家房子不卖");
            return false;
        }
    }
}



package com.figo.study2024.pattern.mediator;

/**
 * @ClassName:BigHouseLandlord
 * @PackageName:com.figo.study2024.pattern.mediator
 * @Description:大房子房东具体类
 * @Date:2024/3/21 20:45
 * @Author:figo
 */
public class BigHouseLandlord extends Landlord{
    public BigHouseLandlord(Mediator mediator) {
        super(mediator);
        //直接往中介处注册
        mediator.register("bigHouseLandload1",this);
    }

    @Override
    public boolean signContract(int price) {
        if(price>=500)
        {
            System.out.println("大于500万,我家房子出售,来赶紧签合同!");
            return true;
        }else {
            System.out.println("小于500万,我家房子不卖");
            return false;
        }
    }
}

中介:

java 复制代码
package com.figo.study2024.pattern.mediator;

/**
 * @ClassName:Mediator
 * @PackageName:com.figo.study2024.pattern.mediator
 * @Description:中介者接口
 * @Date:2024/3/21 20:21
 * @Author:figo
 */
public interface Mediator {
    void register(String name,Landlord landlord); //注册客户对象,房主在中介登记了信息
    void unRegister(String name);
    void sendMessage(int price); //转发客户信息,与客户对象交互信息的方法

}


package com.figo.study2024.pattern.mediator;

import java.util.HashMap;
import java.util.Map;

/**
 * @ClassName:LandlordMediator
 * @PackageName:com.figo.study2024.pattern.mediator
 * @Description:房地产中介者
 * @Date:2024/3/21 20:51
 * @Author:figo
 */
public class LandlordMediator implements Mediator{
    private Map<String,Landlord> landlordMap;
    public LandlordMediator(){
        synchronized (this) {
            if(landlordMap==null) {
                landlordMap = new HashMap<>();
            }
        }
    }
    @Override
    public void register(String name, Landlord landlord) {
        landlordMap.put(name,landlord);
    }

    @Override
    public void unRegister(String name) {
        landlordMap.remove(name);
    }

    /**
     * 将客户出的价格,去轮询各个卖家是否有意向
     * @param price
     */
    @Override
    public void sendMessage(int price) {
        for(Map.Entry<String,Landlord> entry :landlordMap.entrySet()) {
            boolean isSuccess=landlordMap.get(entry.getKey()).signContract(price);
            if(isSuccess) {
                System.out.println(entry.getKey() + "愿意出售房子");
            }
        }
    }
}

客户:

java 复制代码
package com.figo.study2024.pattern.mediator;

/**
 * @ClassName:PatternTest
 * @PackageName:com.figo.study2024.pattern.mediator
 * @Description:模拟客户端调用中介者模式
 * @Date:2024/3/21 21:12
 * @Author:figo
 */
public class PatternTest {
    public static void main(String[] args) {
        LandlordMediator mediator=new LandlordMediator();
        //注册过程,可以在其他地方已经完成,不用写在客户端,这里测试需要,简单点写这里了
        BigHouseLandlord bigHouseLandlord=new BigHouseLandlord(mediator);
        SmallHouseLandlord smallHouseLandlord=new SmallHouseLandlord(mediator);
        System.out.println("-------------买家出100w,看看是否有卖家愿意出手---------------");
        mediator.sendMessage(100);
        System.out.println("-------------买家出200w,看看是否有卖家愿意出手---------------");
        mediator.sendMessage(200);
        System.out.println("-------------买家出500w,看看是否有卖家愿意出手---------------");
        mediator.sendMessage(500);
    }
}

运行结果:

-------------买家出100w,看看是否有卖家愿意出手---------------

小于200万,我家房子不卖

小于500万,我家房子不卖

-------------买家出200w,看看是否有卖家愿意出手---------------

大于200万,我家房子出售,来赶紧签合同!

smallHouseLandloard1愿意出售房子

小于500万,我家房子不卖

-------------买家出500w,看看是否有卖家愿意出手---------------

大于200万,我家房子出售,来赶紧签合同!

smallHouseLandloard1愿意出售房子

大于500万,我家房子出售,来赶紧签合同!

bigHouseLandload1愿意出售房子

相关推荐
on the way 1236 小时前
结构性设计模式之Flyweight(享元)
java·设计模式·享元模式
暴躁哥10 小时前
深入理解设计模式之访问者模式
设计模式·访问者模式
佩奇的技术笔记11 小时前
从Java的JDK源码中学设计模式之装饰器模式
java·设计模式·装饰器模式
on the way 12311 小时前
结构型设计模式之Proxy(代理)
设计模式·代理模式
YGGP14 小时前
【结构型模式】装饰器模式
设计模式
将编程培养成爱好16 小时前
《复制粘贴的奇迹:小明的原型工厂》
c++·设计模式·原型模式
liang_jy17 小时前
设计模式中的几大原则
设计模式·面试
huangyujun992012319 小时前
设计模式杂谈-模板设计模式
java·设计模式
magic 24519 小时前
Java设计模式:责任链模式
java·设计模式·责任链模式
YGGP1 天前
【结构型模式】代理模式
设计模式