23种设计模式之门面模式

门面模式的定义

定义: 要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行. 门面模式提供一个高层次的接口, 使得子系统更易于使用.

通俗的说, 就是设计一个类,专门用于对外服务的, 门面对象是外界访问子系统内部的唯一通道

其类图如下:

23种设计模式之门面模式

 

其中两个角色如下:

  1. Facade 门面角色: 客户端可以调用这个角色的方法. 此角色知晓子系统的所有功能和责任. 一般情况下, 本角色会将所有从客户端发来的请求委派到相应的子系统去, 也就是说该角色没有实际的业务逻辑, 只是一个委托类
  2. Subsystem 子系统角色: 可以同时有一个或多个子系统. 每一个子系统都不是一个单独的类, 而是一个类的集合.子系统并不知道门面的存在. 对于子系统而言, 门面仅仅是另外一个客户端而已

子系统代码如下:

23种设计模式之门面模式

 

门面对象代码:

23种设计模式之门面模式

 

门面模式的应用

门面模式的优点:

  1. 减少系统的相互依赖. 如果不使用门面模式, 外界访问直接深入到子系统内部, 相互之间是一种强耦合关系, 这样的强依赖是系统设计所不能接受的. 门面模式的出项很好的解决了这个问题, 所有的依赖都是对门面对象的依赖, 与子系统无关.
  2. 提高了灵活性. 依赖减少了, 灵活性自然提高了.
  3. 提高安全性. 想让你访问子系统的哪些业务就开通那些逻辑, 不在门面上开通的方法, 休想访问到

门面模式的缺点:

门面模式最大的缺点就是不符合开闭原则, 对修改关闭, 对扩展开放. 一旦在系统投产后发现有一个小错误, 怎么解决? 完全最从开闭原则,根本没办法解决. 唯一能做的一件事就是修改门面对象的代码, 这个风向相当大.

门面模式的使用场景:

  1. 为一个复杂的模块或子系统提供一个供外界访问的接口
  2. 子系统相对独立--外界对子系统的访问只要黑箱操作即可.
  3. 预防低水平人员带来的风险扩散.

门面模式的注意事项

1.一个子系统可以有多个门面

  1. 门面已经庞大到不能忍受的重读. 当一个门面对象过于庞大, 虽然都是非常简单的委托操作, 也建议拆分成多个门面,否则会给以后的维护和扩展带来不必要的麻烦. 按照功能拆分是一个非常好的原则, 比如一个数据库操作的门面可以拆分为增删改查等
  2. 子系统可以提供不同访问路径, 当有两个不同的高层模块来访问子系统, 模块二属于受限访问对象, 只能访问methodB 方法, 如何处理呢?

23种设计模式之门面模式

 

增加的门面非常简单, 委托给已经存在的门面对象来处理. 这样可以尽量保持相同的代码只编写一遍, 避免以后到处修改相似代码的悲剧.

2.门面不参与子系统内的业务逻辑

门面对象中不要出现具体的业务逻辑代码, 否则就会产生一个倒依赖的问题, 在门面模式中, 门面角色应该是稳定的, 它不应该经常变化, 一个系统一旦投入运行他就不应该被改变, 它是一个系统对外的接口, 变来变去还怎么保证其他模块的稳定运行呢?

如果一定要出现业务处理, 应该建立一个封装类, 封装完毕后提供给门面对象使用.


门面模式是一个很好的封装方法, 一个子系统比较复杂时, 比如算法或者业务比较复杂, 就可以封装出一个或多个门面出来, 项目的接口简单, 而且扩展性非常好. 还有, 对于一个较大的项目, 为了避免人员带来的风险, 也可以使用门面模式.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508531.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

转载:Android Studio 3.1.2 新项目报错 AAPT2 error: check logs for details (Gradle 3.1.2)

转载自 https://blog.csdn.net/u011618035/article/details/80574645 原本好好的项目,突然有一天打开就开始报错AAPT2 error: check logsfor details。展开错误详细信息错误文本com.android.build.gradle.tasks.ResourceException:Error: java.util.concurrent.Exec…

23种设计模式之迭代器模式

迭代器模式的定义 定义: 它提供一种方法访问一个容器对象中各个元素, 而又不需暴露该对象的内部细节 其类图如下: 其中角色: Iterator 抽象迭代器: 抽象迭代器负责定义访问和遍历元素的接口, 而且基本上是有固定的三个方法: first()获得第一个元素, next()访问下一个元素, i…

23种设计模式之适配器模式

适配器模式的定义 定义: 将一个类的接口变换成客户端所期待的另一种接口, 从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 通俗的说, 就是有 A、B两个接口, 现在要求把A和B安装在一起使用, 两者的接口不一致, 怎么办? 引入一个物体C, 如下图: 引入C物体后,…

23种设计模式之组合模式

组合模式的定义 定义: 将对象组合成树形结构以表示 "部分-整体" 的层次结构,使得用户对单个对象和组合对象的使用具有一致性. 通俗的说, 就是实现了树形结构 通用类图如下: 其中的三个角色如下: Component 抽象构件角色: 定义参加组合对象的共有方法和属性, 可以…

23种设计模式之观察者模式

观察者模式的定义 定义: 定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新 通俗的说, 就是一个类的某个条件满足时, 会调用一系列定义好的方法 其类图如下: 其中的4个角色: Subject 被观察者: 定义被观察者必须实现…

23种设计模式之访问者模式

访问者模式的定义 定义: 封装一些作用于某种数据结构中的各元素的操作, 它可以在不改变数据结构的前提下定义作用于这些元素的新的操作 通俗的说, 就是定义一个访问者角色, 当对指定角色进行访问时要通过访问者进行访问 其类图如下: 各角色说明: Vistor 抽象访问者: 抽象类…

23种设计模式之解释器模式

解释器模式的定义 定义: 给定一门语言,定义它的文法的一种表示, 并定义一个解释器, 该解释器使用该表示来解释语言中的句子. 其类图如下: 其中的角色说明: AbstractExpression 抽象解释器: 具体的解释任务由各个实现类完成TerminalExpression 终结符表达式: 实现与文法中的元…

23种设计模式之备忘录模式

备忘录模式的定义 定义: 在不破坏封装性的前提下, 捕获一个对象的内部状态, 并在该对象之外保存这个状态. 这样以后就可将该对象回复到原先保存的状态 通俗的说, 就是记录下类的当前状态, 当需要的时候恢复 类图如下: 其中各角色如下: Originator 发起人角色: 记录当前时刻…

23种设计模式之状态模式

状态模式的定义 定义: 当一个对象内在状态改变时允许其改变行为, 这个对象看起来像改变了其类 通俗的说, 就是一个事物有不同的状态,在不同状态下执行各个方法时有不同的表现, 将每个状态都封装成一个类, 然后通过上下文对象统一管理 其类图如下: 其中的三个角色如下: Stat…

二维码的纠错码原理及细节

参考文档: https://www.thonky.com/qr-code-tutorial/error-correction-coding 1. 消息多项式 消息多项式的系数组成:数字码字。如“hello world” ,利用二维码的编码原理,转换成十进制数字为“32, 91, 11, 120, 209, 114, 220, 77, 67, 64…

Android 二维码扫码功能实现(Zxing集成,避坑启示)

这两天想要实现一个能扫码的app,找了一下,发现zxing用的比较多,就在网上找了找怎么用zxing。我主要是按照宇宝守护神的博文“Android 二维码的扫码功能实现(一)”的步骤完成的,博文链接在此:htt…

23种设计模式之桥梁模式

桥梁模式的定义 定义: 将抽象和实现解耦, 使得两者可以独立的变化 通俗的说, 就是一个类调用另一个类中的方法, 需要一个桥梁, 通过聚合的关系调用 其类图如下: 其中角色说明如下: Abstraction 抽象化角色: 它的主要职责是定义出该角色的行为, 同时保存一个对实现化角色的引…

23种设计模式之享元模式

享元模式的定义 定义: 使用共享对象可有效的支持大量的细粒度的对象 通俗的说, 就是将类的通用属性抽出来,建立对象池,以达到限制对象数量的效果 上面定义中要求细粒度对象, 那么不可避免的使得对象数量多且性质相近, 我们将这些对象的信息分为两个部分: 内部状态和外部状态…

射频(RF)基本理论:定义、特性、调制、扩频

参考: INTRO TO SDR AND RF SIGNAL ANALYSIS 一文让你读懂调幅、调相、调频、 与 I/Q 调制?它们的区别详解 无线网络技术教程(第二版) 金光、江先亮编 数字调制系列:IQ调制基本理论 1. 什么是射频? …

设计模式之规格模式

规格模式 规格模式 使用了策略模式,组合模式. 只不过将模式具体化了 规格模式将 与或非 操作进行了封装, 实现了类似 SQL查询语句的操作. 类图如下: 其中的角色如下: ISpecification 抽象规格书: 对规格书的抽象定义CompositeSpecification 组合规格书: 抽象类, 对规格书进…

设计模式之雇工模式

雇工模式 雇工模式也叫仆人模式, 其意图为: 雇工模式是行为模式的一种, 它为一组类提供通用的功能,而不需要类实现这些功能,它是命令模式的一种扩展. 其类图如下: 其中角色如下: IServiced : 用于定义服务内容的接口Serviced1 : 具体的服务提供者Servant : 执行者,即雇工类,…

设计模式之对象池模式

对象池模式 对象池模式, 或者称为对象池服务, 其意图为: 通过循环使用对象, 减少资源在初始化和释放时的昂贵损耗(这里的"昂贵"可能是时间效益(如性能), 也可能是空间效益(如并行处理), 在大多情况下, 指性能) 简单的说, 在需要时,从池中提取,不用时,放回池中,等待…

WiFi的基本调制过程

参考:Parallel Inclusive Communication for Connecting Heterogeneous IoT Devices at the Edge 基本的WiFi调制分为以下三个步骤: 1. 将信号调制到正弦波上。 WiFi采用QAM(正交振幅调制),用I/Q信号表示的话&#…

设计模式之黑板模式

黑板模式的意图 黑板模式是观察者模式的一个扩展,知名度并不高,但使用的范围却非常广. 其意图为: 允许消息的读写同时进行, 广泛的交互消息. 简单的说, 黑板模式允许多个消息读写者同时存在, 消息的生产者和消费者完全分开. 这就像一个黑板, 任何一个老师(消息的生产者)都可以…

蓝牙调制

参考:Parallel Inclusive Communication for Connecting Heterogeneous IoT Devices at the Edge 《从创意到原型:物联网应用快速开发》 董玮,高艺编著 详解蓝牙标准中的GFSK调制:https://blog.csdn.net/lovehua365/article/detai…