设计模式-门面模式(Facade Pattern)
一、定义
要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。
二、概念解释
一句话就是化零散为整体,当我想要做一件事而这件事需要我找很多人才能处理完时,我就可以去创建一个门面,通过这个门面我只需要告诉它我要做什么事,而怎么完成这件事我不需要关心,门面会去完成
三、场景
我比较爱玩手机游戏,而游戏里变强的方式不要太多,升级、装备、宠物、称号等等,我要想变强,就得方方面面加强,打怪升级、装备精炼、捕捉宠物、获取称号。每个都得搞,累啊,灵机一动,找个代打的人,我只要告诉他我要变强,其余的活我就不问了,让代打的帮我处理,岂不很香
四、实现
1、类图
2、代码实现
首先定义一个变强方式的接口
public interface StrongerWay{
/**
* 打怪升级
*/
void upgrade();
/**
* 精炼装备
*/
void refineEquip();
/**
* 捕捉宠物
*/
void capturePet();
/**
* 获取称号
*/
void getTitle();
}
定义一个变强方式接口的具体实现类
public class StrongerWayImpl implements StrongerWay {
@Override
public void upgrade() {
System.out.println("打怪升级");
}
@Override
public void refineEquip() {
System.out.println("精炼装备");
}
@Override
public void capturePet() {
System.out.println("抓宝宝");
}
@Override
public void getTitle() {
System.out.println("获取称号");
}
}
定义门面将各个变强的方式整合 提供一个统一访问的对象
public class StrongerWayFacade {
StrongerWay strongerWay = new StrongerWayImpl();
public void beStrong() {
strongerWay.upgrade();
strongerWay.refineEquip();
strongerWay.capturePet();
strongerWay.getTitle();
}
}
我想变强的时候就不需要调用实现类的每一个方法了 只要统一访问门面提供的方法即可
@SpringBootTest
public class FacadeTest {
@Test
void test() {
StrongerWayFacade strongerWayFacade = new StrongerWayFacade();
strongerWayFacade.beStrong();
}
}
五、优缺点
优点
- 解耦:解除了直接访问子系统内部的这种强依赖关系
- 安全:除了门面提供的方法,子系统中其他的方法想都别想
缺点
- 不符合开闭原则,我新增个变强方式就得动门面代码,只要动了原来的代码,风险系数就会狂飙
五、区别
门面模式的子系统可能代表一个类,也可能是几十个对象的集合,通过这个点可以较容易的区分门面和代理模式,代理模式更多的是对原有类的增强