Mediator,中介者模式:用一个中介对象封装一些列的对象交互。属于行为型模式
Facade,外观模式:为子系统中的一组接口提供一致的界面,facade
提供了一高层接口,这个接口使得子系统更容易使用。属于结构型模式
两者其实挺像,但是外观模式更多的是把一系列过程封装在一个外观类,比如下单,支付,增加积分几个服务封装在一个外观类,客户端直接调用这个外观类的一个方法即可,就不用依次去调用了各个服务了,参考设计模式(五):外观模式(结构型模式)
而中介者模式,中介者负责消息的传递,解耦客户端对象和服务端对象各个接口的交互。
中介者全程参与交易过程,而外观模式外观类只是负责封装各个子系统的接口。不直接参与交易。
下面举例房地产中介参与房子买卖过程。
试想,如果没有中介者参与其中,买房者需要挨家挨户去敲门,你们家卖房子不?卖多少钱?很多人是不卖房的,你会吃闭门羹,你(客户端对象)和房东(服务端对象)之间是紧密耦合的,有了中介,他事先帮你把房地产信息收集好了。他可以主动去联系房东,或者房东主动去他们店挂牌。你只需要联系中介就可以了。说出你的需求,中介帮你匹配房源,促成你和房东之间的交易即可。你只需要和中介一个人耦合即可,和房东们之间松耦合。
类图:
上代码:
房东:
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);}@Overridepublic 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);}@Overridepublic boolean signContract(int price) {if(price>=500){System.out.println("大于500万,我家房子出售,来赶紧签合同!");return true;}else {System.out.println("小于500万,我家房子不卖");return false;}}
}
中介:
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<>();}}}@Overridepublic void register(String name, Landlord landlord) {landlordMap.put(name,landlord);}@Overridepublic void unRegister(String name) {landlordMap.remove(name);}/*** 将客户出的价格,去轮询各个卖家是否有意向* @param price*/@Overridepublic 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() + "愿意出售房子");}}}
}
客户:
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愿意出售房子