首页 > 其他分享 >设计模式-门面模式

设计模式-门面模式

时间:2023-09-13 11:35:45浏览次数:38  
标签:调用 App 接口 模式 门面 设计模式 public

门面模式


(文章目录)


1、什么是门面模式

  门面模式为子系统提供一组统一的接口,定义一组高层接口让子系统更易用。注意这里针对的是接口。   这个定义很简洁,我再进一步解释一下。   假设有一个系统 A,提供了 a、b、c、d 四个接口。系统 B 完成某个业务功能,需要调用 A 系统的 a、b、d 接口。利用门面模式,我们提供一个包裹 a、b、d 接口调用的门面接口 x,给系统 B 直接使用。   不知道你会不会有这样的疑问,让系统 B 直接调用 a、b、d 感觉没有太大问题呀,为什么还要提供一个包裹 a、b、d 的接口 x 呢?关于这个问题,我通过一个具体的例子来解释一下。   假设我们刚刚提到的系统 A 是一个后端服务器,系统 B 是 App 客户端。App 客户端通过后端服务器提供的接口来获取数据。我们知道,App 和服务器之间是通过移动网络通信的,网络通信耗时比较多,为了提高 App 的响应速度,我们要尽量减少 App 与服务器之间的网络通信次数。   假设,完成某个业务功能(比如显示某个页面信息)需要“依次”调用 a、b、d 三个接口,因自身业务的特点,不支持并发调用这三个接口。 如果我们现在发现 App 客户端的响应速度比较慢,排查之后发现,是因为过多的接口调用过多的网络通信。   针对这种情况,我们就可以利用门面模式,让后端服务器提供一个包裹 a、b、d 三个接口调用的接口 x。App 客户端调用一次接口 x,来获取到所有想要的数据,将网络通信的次数从 3 次减少到 1 次,也就提高了 App 的响应速度。

2、为什么要用门面模式

2.1、 解决易用性问题

  门面模式可以用来封装系统的底层实现,隐藏系统的复杂性,提供一组更加简单易用、更高层的接口。   比如,Linux 系统调用函数就可以看作一种“门面”。它是 Linux 操作系统暴露给开发者的一组“特殊”的编程接口,它封装了底层更基础的 Linux 内核调用。   再比如,Linux 的 Shell 命令,实际上也可以看作一种门面模式的应用。它继续封装系统调用,提供更加友好、简单的命令,让我们可以直接通过执行命令来跟操作系统交互。   其实,设计原则、思想、模式很多都是相通的,是同一个道理不同角度的表述。实际上,从隐藏实现复杂性,提供更易用接口这个意图来看,门面模式有点类似之前讲到的迪米特法则(最少知识原则)和接口隔离原则:两个有交互的系统,只暴露有限的必要的接口。   除此之外,门面模式还有点类似之前提到封装、抽象的设计思想,提供更抽象的接口,封装底层实现细节。

2.2、 解决性能问题

  关于利用门面模式解决性能问题这一点,刚刚我们已经讲过了。我们通过将多个接口调用替换为一个门面接口调用,减少网络通信成本,提高 App 客户端的响应速度。所以,关于这点,我就不再举例说明了。   我们来讨论一下这样一个问题:从代码实现的角度来看,该如何组织门面接口和非门面接口?

  • 如果门面接口不多,我们完全可以将它跟非门面接口放到一块,也不需要特殊标记,当作普通接口来用即可。
  • 如果门面接口很多,我们可以在已有的接口之上,再重新抽象出一层,专门放置门面接口,从类、包的命名上跟原来的接口层做区分。
  • 如果门面接口特别多,并且很多都是跨多个子系统的,我们可以将门面接口放到一个新的子系统中。

2.3、 解决分布式事务问题

  关于利用门面模式来解决分布式事务问题,我们通过一个例子来解释一下。   在一个金融系统中,有两个业务领域模型,用户和钱包。这两个业务领域模型都对外暴露了一系列接口,比如用户的增删改查接口、钱包的增删改查接口。   假设有这样一个业务场景:在用户注册的时候,我们不仅会创建用户(在数据库 User 表中),还会给用户创建一个钱包(在数据库的 Wallet 表中)。 对于这样一个简单的业务需求,我们可以通过依次调用用户的创建接口和钱包的创建接口来完成。   但是,用户注册需要支持事务,也就是说,创建用户和钱包的两个操作,要么都成功,要么都失败,不能一个成功、一个失败。 要支持两个接口调用在一个事务中执行,

3、如何使用门面模式

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

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

下面是门面模式的通用代码示例:

public class SubSystemA{
    public void doA(){
        System.out.println("doing A stuff");
    }
}

public class SubSystemB{
    public void doB(){
        System.out.println("doing B stuff");
    }
}

public class SubSystemC{
    public void doC(){
        System.out.println("doing C stuff");
    }
}


public class Facade{
    private SubSystemA a = new SubSystemA();
    private SubSystemB b = new SubSystemB();
    private SubSystemC c = new SubSystemC();

    //对外接口
    public void doABC(){
        this.a.doA();
        this.b.doB();
        this.c.doC();
    }
}

4、总结

  我们知道,类、模块、系统之间的“通信”,一般都是通过接口调用来完成的。接口设计的好坏,直接影响到类、模块、系统是否好用。   所以,我们要多花点心思在接口设计上。我经常说,完成接口设计,就相当于完成了一半的开发任务。只要接口设计得好,那代码就差不到哪里去。 接口粒度设计得太大,太小都不好。太大会导致接口不可复用,太小会导致接口不易用。   在实际的开发中,接口的可复用性和易用性需要“微妙”的权衡。针对这个问题,我的一个基本的处理原则是,尽量保持接口的可复用性,但针对特殊情况,允许提供冗余的门面接口,来提供更易用的接口。

标签:调用,App,接口,模式,门面,设计模式,public
From: https://blog.51cto.com/u_15322552/7453125

相关文章

  • Oauth2.0授权码模式
    参考:https://blog.csdn.net/qq15035899256/article/details/129541483授权码模式这种模式是最安全的一种模式,也是推荐使用的一种,比如我们手机上的很多App都是使用的这种模式。相比隐式授权模式,它并不会直接返回Token,而是返回授权码,真正的Token是通过应用服务器访问验证服......
  • UI 自动化测试框架:PO 模式+数据驱动
    1.PO设计模式简介什么是PO模式?PO(PageObject)设计模式将某个页面的所有元素对象定位和对元素对象的操作封装成一个Page类,并以页面为单位来写测试用例,实现页面对象和测试用例的分离。PO模式的设计思想与面向对象相似,能让测试代码变得可读性更好,可维护性高,复用性高。PO模......
  • 6. 前端设计模式之观察者模式
    使用观察者模式,我们可以将某些对象(观察者)订阅到另一个对象(可观察对象)。当一个事件发生时,可观察对象会通知它的所有观察者!这个模式出境的概率就比较高了,无论是在前端还是后端,都能见到它的身影,特别跟事件有关的场景。从定义看这个模式涉及到两种对象,一种可观察对象也就是观察的......
  • 单例模式的五种实现方式
    参考https://blog.csdn.net/qq_42372017/article/details/1211924451.单例模式的四大原则构造方法私有以静态方法或者枚举返回实例多线程环境下都是访问同一个实例反序列化时不会重新构建对象2.单例模式通常有5种实现方法2-1饿汉模式饿汉模式会在类初始化时就提前......
  • 设计模式-装饰器模式
    装饰器模式(文章目录)什么是装饰器模式  装饰器(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式。为什么使用装饰器模式使用装饰者模式有如下好处:  1.避免了类爆炸问题,简化了设计  2.易于扩展,可以灵活组......
  • Android开发中常见的设计模式
    Android开发中常见的设计模式对于开发人员来说,设计模式有时候就是一道坎,但是设计模式又非常有用,过了这道坎,它可以让你水平提高一个档次。而在android开发中,必要的了解一些设计模式又是非常有必要的。对于想系统的学习设计模式的同学,这里推荐2本书。一本是HeadFirst系列的HeadH......
  • Padavan配置白名单模式及上网时间控制
    登录Padavan管理后台,高级设置--->防火墙--->mac访问控制--->mac访问控制模式【允许模式---仅列表中的设备可获取网络;拒绝模式---列表中的设备拒绝访问网络】,禁止访问路由器主机这项一定打开,不然试了下没效果,开了就是未在列表中的设备不能访问路由器,初次连接的设备也无法获取ip地......
  • 在.NET中实现事件驱动编程模式
    当在.NET中实现事件驱动编程模式时,你可以创建自定义事件和委托,然后让对象触发事件,以便其他对象可以订阅并响应这些事件。这种模式常用于构建可扩展和松散耦合的应用程序。以下是一个基本示例,演示如何在C#中实现事件驱动编程。步骤1:创建一个C#控制台应用程序首先,创建一个新的C#控......
  • Ubuntu Server 22.04 双网卡绑定 配置文件 Bond mode 1 : active-backup 主备模式
    UbuntuServer22.041.拓扑视图实例 2.备份配置文件修改前备份root@ax:~#cpetc/netplan/00-installer-config.yamletc/netplan/00-installer-config.yaml.orig修改配置文件,Ubuntu严格区分格式,空格缩进。简要说明:eno1-eno4,关闭dhcp;bond0只绑定eno1、eno2,实际可根据情况,绑定更多......
  • 软件设计模式系列之三———工厂方法模式
    1模式的定义工厂方法模式是一种常见的设计模式,属于创建型设计模式之一,它在软件工程中用于对象的创建。该模式的主要思想是将对象的创建过程抽象化,将具体对象的实例化延迟到子类中完成,以便在不同情况下可以创建不同类型的对象,而客户端代码不需要知道实际创建的对象类型。2举例......