创建型模式在这场战争中已经扫荡完成,在这个战略途中。我们南部战区已经把创建型的敌军全部歼灭。剩下开始进攻其他防线战区。主要针对结构型军队进行手术刀式打击。离我们占领敌军司令部,插上大旗不远了。同志们,想着胜利勇敢前进。炮火很猛,我们慢慢来。先解决 Facade门面模式 这个小喽喽练练手。
六、设计模式之门面模式【Facade】
也叫: 外观模式
所属类型 | 定义 |
---|---|
结构型 | 要求一个子系统的外部和内部的通信必须通过一个统一的对象进行。 |
门面模式注重“统一的对象”,也就是子系统提供统一的访问接口,这让使用者不能通过其他方式访问子系统。
能帮我们干什么?
主要解决什么问题?
主要解决的是 解决接口的复用性和易用性之间的冲突
同时解决了
优缺点
优点
1. 减少各个系统的相互依赖
2. 提高灵活性
> 依赖降低后,子系统的变化,不会影响facade
4. 提高了安全性
> 访问控制
缺点:
- 不符合开闭原则
使用的场景
- 反腐层 【适配器+门面模式】
- 对接第三方系统时
- 有外部系统需要对接时,或外部包需要引入时。不希望外部的逻辑影响到内部的代码逻辑。
实现
角色
- Facade
此角色知道子系统的所有功能和责任。并提供一些方法调用委托到相应的子系统。也就是说,该角色没有任何业务逻辑,只是一个委托类。
- subSystem 子系统角色
子系统可以有多个子系统。可以有许多子系统暴露的类。但是子系统式不知道门面类的。有子系统内部决定暴露那些能力给门面类。
门面模式
实现难度: ⭐️ ⭐️
public class LolFacade {
private AliSubSystemSdK subSystemSdK = new AliSubSystemSdK();
private WecahtPay wecahtPay = new WecahtPay();
/**
* lol 十连抽奖
*/
public void lolPd(){
boolean b = wecahtPay.PrizeDraw();
if(b) subSystemSdK.sendSend("短信通知:》》》 lol 十连抽奖 。。。 ");
}
public void recharge(long money){
wecahtPay.recharge(money);
subSystemSdK.sendSend("》》》充值了:" + money);
}
}
测试方法
public class FacadeTest {
@Test
public void testFacade(){
LolFacade lolFacade = new LolFacade();
lolFacade.lolPd();
lolFacade.recharge(1990);
lolFacade.lolPd();
}
}
总结
- 一个子系统可以有多个门面
当门面已经变得臃肿时
子系统可以提供不同访问路径 - 门面不参与子系统的逻辑,子系统不知道门面的存在