首页 > 其他分享 >设计模式之外观模式

设计模式之外观模式

时间:2023-12-04 12:33:17浏览次数:37  
标签:外观 attributesForUsage const vertexSizeInBytes 模式 usage attributesByUsage 设计模式 Ve

1. 定义

提供了一个统一的接口,用来访问子系统中的一组接口

2. 口语化表述

工厂里组装台灯,流程、配件等有多种方式,每种台灯有自己的生产线

现在,需要某一种台灯,一种方式是直接去找这个台灯的生产线生成,这会令人烦恼,因为寻找是一件无聊而繁琐的事情

另一种方式是成立一个工厂前台,需要什么台灯就只需要给前台说明,前台会告诉对应的生产线,并将生产好的台灯交付给你

这流程就简单多了,不管是谁来,他都只需和前台联系,然后工厂就会给他对应的产品,这就是外观模式,前台就是工厂的外观

上述情景表述的是产品创建,所以也是简单工厂模式的典型应用(简单工厂模式侧重于创建,而外观模式不局限于创建产品)

下面的描述会沿用这个上述这个场景

3. 源码示例

Cesium.js是一个著名的、基于WebGL的GIS前端框架

基于WebGL就不得不提WebGL(OpenGL)的基础概念,比如VAO(顶点数组对象)、VBO(顶点缓冲对象)等

Cesium.js在渲染模块中,有一个对象叫VertexArrayFacade,该对象大致源码如下:

function VertexArrayFacade(context, attributes, sizeInVertices, instanced) {

  // ...
  const attrs = VertexArrayFacade._verifyAttributes(attributes);
  sizeInVertices = defaultValue(sizeInVertices, 0);

  // Bucket the attributes by usage.
  const length = attrs.length;
  for (let i = 0; i < length; ++i) {
    const attribute = attrs[i];

    usage = attribute.usage;
    attributesForUsage = attributesByUsage[usage];
    if (!defined(attributesForUsage)) {
      attributesForUsage = attributesByUsage[usage] = [];
    }

    attributesForUsage.push(attribute);
  }

  for (usage in attributesByUsage) {
    if (attributesByUsage.hasOwnProperty(usage)) {
      attributesForUsage = attributesByUsage[usage];

      attributesForUsage.sort(compare);
      const vertexSizeInBytes = VertexArrayFacade._vertexSizeInBytes(
        attributesForUsage
      );

      const bufferUsage = attributesForUsage[0].usage;

      const buffer = {
        vertexSizeInBytes: vertexSizeInBytes,
        vertexBuffer: undefined,
        usage: bufferUsage,
        needsCommit: false,
        arrayBuffer: undefined,
        arrayViews: VertexArrayFacade._createArrayViews(
          attributesForUsage,
          vertexSizeInBytes
        ),
      };

      this._allBuffers.push(buffer);
    }
  }
  // ...
  this.resize(sizeInVertices);
}

代码片段看上去有点多,但是不难理解,这个VertexArrayFacade对象主要就是对VertexArray做一系列的处理

外部操作VertexArray时,只需要调用这个VertexArrayFacade对象即可

4. 总结

4.1 设计优点

  • 让代码独立于复杂子系统

    将复杂的过程对外隐藏,外部只需要联系外观对象即可

4.2 适用场景

  • 需要一个指向复杂子系统的直接接口,且该接口的功能有限(对外暴露的函数数量不多)

5. 参考资料

[1] 外观设计模式(门面模式) (refactoringguru.cn)

[2] cesium/packages/engine/Source/Renderer/VertexArrayFacade.js at main · CesiumGS/cesium (github.com)

标签:外观,attributesForUsage,const,vertexSizeInBytes,模式,usage,attributesByUsage,设计模式,Ve
From: https://www.cnblogs.com/jiujiubashiyi/p/17874661.html

相关文章

  • 深入理解HarmonyOS UIAbility:生命周期、WindowStage与启动模式探析
    本文分享自华为云社区《深入理解HarmonyOSUIAbility:生命周期、WindowStage与启动模式探析》,作者:柠檬味拥抱。UIAbility组件概述UIAbility组件是HarmonyOS中一种包含UI界面的应用组件,主要用于与用户进行交互。每个UIAbility组件实例对应最近任务列表中的一个任务,可以包含多个页......
  • “数据结构”模式之迭代器(Iterator)模式
    常常有一些组件在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大地破坏组件的复用。这时候,将这些特定数据结构封装在内部,在外部提供统一的接口,来实现与特定数据结构无关的访问,是一种行之有效的解决方案。典型模式:CompositeIteratorChainofResposibilit......
  • 设计模式之七大原则
    单一职责原则类的职责要单一,不能将太多的职责放在一个类中。请看代码示例:未采用单一职责原则packagecom.std.www.designPattern.principle;classStudent{publicvoidgetDBConnection(){System.out.println("连接到数据库");}publicvoidaddStu......
  • “接口隔离模式”之外观模式(门面模式)
    1模式动机外观模式属于“接口隔离模式”的一种。  下图中,A方案的问题在于组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战。如何简化外部客户程序和系统间的交互接口?如何将外部客户程序的演化和内......
  • 设计模式
    设计模式分创建型、结构型、行为型模式,以下是详述创建型模式隐藏了创建对象的过程,通过逻辑方法创建对象,而不是通过new关键字*工厂方法模式*抽象工厂模式*单例模式*建造者模式*原型模式结构型模式主要关注类和对象的组合关系继承的概念......
  • JavaScript的设计模式—构造器模式
    设计模式介绍设计模式是我们在解决问题的时候针对特定问题给出的简洁而优化的处理方案在JS设计模式,最核心的思想:封装变化将变与不变分离,确保变化的部分灵活,不变的部分稳定构造器模式varemployee1={name:'Kerwin',age:100}varemployee2={name:'xiaoming',......
  • 使用分布式事务 Seata 的 XA 模式
    上篇博客已经搭建了分布式事务Seata的集群,本篇博客主要介绍如何使用Seata的XA模式。XA模式的规范是X/Open组织定义的分布式事务处理(DTP,DistributedTransactionProcessing)标准,XA模式规范描述了全局的TM与局部的RM之间的接口,几乎所有主流关系型数据库都对XA模式......
  • 极语言3-6窗口类、窗口外观类、子窗口外观类——成员表
    中文名字英文名称长度作用解释窗口类WNDCLASS40用来储存某一类窗口的信息,向系统注册此信息才能创建窗体。窗口类——成员表风格style整数窗口类的风格消息lpfnWndProc整数窗口消息处理函数类长cbClsExtra整数窗口类扩展实长cbWndExtra整数窗口实例扩展实例hInstance整数当前实例句......
  • 23种设计模式——单例模式
    今天来学习23种设计模式的第一种,单例模式,同时也是设计模式中最简单的模式之一。概念:所谓类的单例模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。特点:单例类只有一个实例对象;该单例对象必......
  • 设计模式--观察者模式(Observer Pattern)
    Observer模式观察者模式(ObserverPattern)是一种行为设计模式,它定义了对象之间的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。观察者模式主要包含以下几个角色:Subject(主题):也被称为Observable,它是被观察的对象。当它的状态发生改变时,会通知......