【设计模式系列15】设计模式并没有想象中的那么高深,不信你进来看看门面模式就知道了

设计模式系列总览

设计模式飞机票
三大工厂模式登机入口
策略模式登机入口
委派模式登机入口
模板方法模式登机入口
观察者模式登机入口
单例模式登机入口
原型模式登机入口
代理模式登机入口
装饰者模式登机入口
适配器模式登机入口
建造者模式登机入口
责任链模式登机入口
享元模式登机入口
组合模式登机入口
门面模式登机入口
桥接模式登机入口
中介者模式登机入口
迭代器模式登机入口
状态模式登机入口
解释器模式登机入口
备忘录模式登机入口
命令模式登机入口
访问者模式登机入口
软件设计7大原则和设计模式总结登机入口

前言

提到设计模式,可能有的人就会觉得很抽象,很高深的样子,其实设计模式并没有想象中的那么高深,很多设计模式我们天天都在用,只是自己不知道自己用到的就是设计模式而已。设计模式也是在开发的基础上总结归纳得出来的,并不是什么新颖的东西,只是一种经验的总结而已,如果有觉得设计模式高深莫测的朋友,那么看看这篇门面模式我想一定会改变你的观点,门面模式会让你发出“这也是设计模式?”的感慨。

什么是门面模式

门面模式(Facade Pattern),又被称之为外观模式。门面模式提供了一个统一的接口,这个接口可以用来访问相同子系统或者不同子系统之中的一群接口。门面模式使得系统更加容易调用,属于结构型模式。

门面模式角色

门面模式主要包含了两种角色:

  • 外观角色(Facade):也称门面角色,系统对外统一接口。
  • 子系统角色(SubSystem):可以同时有一个或者多个SubSystem。每个SubSystem都不是一个单独的类,而是一个类的集合。SubSystem并不知道Facade的存在,对于SubSystem而言,Facade也仅仅只是一个调用者(客户端)而已。

门面模式示例

好了,装逼时刻又到了:Talk is cheap,Show you the code,先看一个非常简单的例子。

1、新建2个子系统角色类,每个类中都只有一个方法:

package com.zwx.design.pattern.facade;

public class SubSystemA {
    public void doSomething(){
        System.out.println("I'm A");
    }
}
package com.zwx.design.pattern.facade;

public class SubSystemB {
    public void doSomething(){
        System.out.println("I'm B");
    }
}

2、新建一个门面类来统一提供对外调用子系统接口的方法:

package com.zwx.design.pattern.facade;

public class SimpleFacade {
    private SubSystemA systemA = new SubSystemA();
    private SubSystemB systemB = new SubSystemB();

    public void doA(){
        this.systemA.doSomething();
    }
    public void doB(){
        this.systemB.doSomething();
    }
}

3、最后新建测试类:

package com.zwx.design.pattern.facade;

public class TestSimpleFacade {
    public static void main(String[] args) {
        SimpleFacade simpleFacade = new SimpleFacade();
        simpleFacade.doA();
        simpleFacade.doB();
    }
}

测试类中不会直接调用子系统,而是通过门面类来进行统一调用。

看完这个例子,大家应该会发出感慨了,这种方式我们天天都在用,原来居然就是设计模式之一的门面模式。

还有另一种写法就是假如我们一个流程里面需要很多个子系统的方法一起调用才能完成,那么这时候我们就可以对上面的示例进行改造了,如下我们再新建一个门面类:

package com.zwx.design.pattern.facade;

public class Facade {
    private SubSystemA systemA = new SubSystemA();
    private SubSystemB systemB = new SubSystemB();
    
    public void doAB(){
        this.systemA.doSomething();
        this.systemB.doSomething();
    }
}

然后测试类中就可以直接通过调用一个方法达到调用多个子系统的方法完成一个流程:

package com.zwx.design.pattern.facade;

public class TestFacade {
    public static void main(String[] args) {
        Facade facade = new Facade();
        facade.doAB();
    }
}

门面模式应用场景

门面模式一般可以适用于以下两种场景:
1、当各个子系统越来越复杂时,可以提供门面接口来统一调用
2、构建多层系统结构时,利用门面对象来作为每层的入口,这样可以简化分层间的接口调用

门面模式优缺点

优点:

  • 1、简化了调用过程,调用者无需深入了解子系统,以防给子系统带来风险
  • 2、减少了系统间的依赖,松散了耦合度
  • 3、将系统划分了层次,提高了安全性
  • 4、遵循了迪米特法则(即最少知道原则)

缺点:

  • 1、当增加子系统或者扩展子系统功能时,可能容易带来未知风险
  • 2、不符合开闭原则
  • 3、某些情况下可能会违背单一职责原则

总结

本文主要分析了门面模式及其示例,希望通过本文可以让大家体会到设计模式并没有想象中的那么高深,学习设计模式主要是体会其中的思想,然后在适当的时候可以提升我们运用到我们代码中。
请关注我,和孤狼一起学习进步

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

双子孤狼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值