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

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愿意出售房子

相关推荐
WaaTong18 分钟前
《重学Java设计模式》之 原型模式
java·设计模式·原型模式
霁月风21 分钟前
设计模式——观察者模式
c++·观察者模式·设计模式
暗黑起源喵3 小时前
设计模式-工厂设计模式
java·开发语言·设计模式
wrx繁星点点10 小时前
状态模式(State Pattern)详解
java·开发语言·ui·设计模式·状态模式
金池尽干12 小时前
设计模式之——观察者模式
观察者模式·设计模式
也无晴也无风雨12 小时前
代码中的设计模式-策略模式
设计模式·bash·策略模式
捕鲸叉21 小时前
MVC(Model-View-Controller)模式概述
开发语言·c++·设计模式
wrx繁星点点1 天前
享元模式:高效管理共享对象的设计模式
java·开发语言·spring·设计模式·maven·intellij-idea·享元模式
凉辰1 天前
设计模式 策略模式 场景Vue (技术提升)
vue.js·设计模式·策略模式
菜菜-plus1 天前
java设计模式之策略模式
java·设计模式·策略模式