门面模式
要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。
【我有一个专业的Nikon相机,我就喜欢自己手动调光圈、快门,这样照出来的照片才专业,但MM可不懂这些,教了半天也不会。幸好相机有Facade设计模式,把相机调整到自动档,只要对准目标按快门就行了,一切由相机自动调整,这样M M也可以用这个相机给我拍张照片了。门面模式:外部与一个子系统的通信必须通过一个统一的门面对象进行。
门面模式提供一个高层次的接口,使得子系统更易于使用。每一个子系统只有一个门面类,而且此门面类只有一个实例,也就是说它是一个单例模式。但整个系统可以有多个门面类。】
@Slf4j public class SubsystemA { //业务逻辑A public void doSomethingA() { log.info("{}的业务逻辑。", this.getClass().getSimpleName()); } } @Slf4j public class SubsystemB { //业务逻辑B public void doSomethingB() { log.info("{}的业务逻辑。", this.getClass().getSimpleName()); } } @Slf4j public class SubsystemC { //业务逻辑C public void doSomethingC() { log.info("{}的业务逻辑。", this.getClass().getSimpleName()); } } @Slf4j public class Facade { //被委托的对象 private SubsystemA subsystemA = new SubsystemA(); private SubsystemB subsystemB = new SubsystemB(); private SubsystemC subsystemC = new SubsystemC(); //提供给外部访问的方法 public void businessA() { this.subsystemA.doSomethingA(); } public void businessB() { this.subsystemB.doSomethingB(); } public void businessC() { this.subsystemC.doSomethingC(); } } @Slf4j public class Client { public static void main(String[] args) { Facade facade = new Facade(); facade.businessA(); facade.businessB(); facade.businessC(); } }
优点
减少系统的相互依赖:门面模式可以让场景类只需要依赖门面对象,而与子系统无关。因此可以降低系统耦合。
提高灵活性:以来减少了,不管子系统内部如何变化,只要不修改门面对象的对外接口就行,提高了灵活性。
提高安全性:外部只能通过门面访问子系统的功能,门面没有开放的就不能访问,提高了子系统的安全性。
缺点
门面模式最大的缺点是不符合开闭原则。系统投产后,一旦发现错误,九比西药修改门面角色的代码,风险比较大。
使用场景
当一个复杂的系统模块或者子系统需要向外界提供一个访问接口的时候。
子系统相对独立——其他(子)系统对该系统的访问只需要黑箱操作,不需要关注内部实现细节。
预防低水平人员带来的风险扩散:为降低个人代码质量对整体项目的影响风险,一般指定相关人员在特定的子系统中进行开发,然后提供门面接口进行访问操作。