索引

  • 意图
  • 结构
  • 参与者
  • 适用性
  • 效果
  • 相关模式
  • 实现
    • 实现方式(一):用抽象类定义 Facade 而使子类对应于不同的子系统。

意图

为子系统中的一组接口提供一个一致的界面,Facade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use.

结构

参与者

Facade

  • 知道哪些子系统类负责处理请求。
  • 将客户的请求代理给适当的子系统对象。

Subsystem Classes

  • 实现子系统的功能。
  • 处理由 Facade 对象指派的任务。
  • 没有 Facade 的任何相关信息。

适用性

在以下情况下可以使用 Facade 模式:

  • 当你要为一个复杂子系统提供一个简单接口时。
  • 客户程序与抽象类的实现部分之间存在着很大的依赖性。
  • 当你需要构建一个层次结构的子系统时,使用 Facade 模式定义子系统中每层的入口点。

效果

  • 它对客户屏蔽子系统组件,使用 Facade 的客户程序不需要直接访问子系统对象。
  • 它实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的。
  • 如果应用需要,它并不限制它们使用子系统类。因此你可以在系统易用性和通用性之间加以选择。

相关模式

  • Abstract Factory 模式可以与 Facade 模式一起使用以提供一个接口,这一接口可用来以一种子系统独立的方式创建子系统对象。
  • Mediator 模式与 Facade 模式的相似之处是,它抽象了一些已有的类的功能。Mediator 的目的是对同事之间的任意通讯进行抽象,通常集中不属于任何单个对象的功能。Facade 模式仅对子系统接口进行抽象,并不定义新功能。
  • 通常来讲,可能仅需要一个 Facade 对象,因此可以用 Singleton 模式定义 Facade。

实现

实现方式(一):用抽象类定义 Facade 而使子类对应于不同的子系统。

将一个系统划分成若干个子系统有利于降低系统的复杂性。一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小。

大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。

Facade 可以提供一个简单的缺省视图,这一视图对于大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过 Facade 层。

用抽象类实现 Facade 而它的具体子类对应于不同的子系统实现,这可以进一步降低客户与子系统的耦合度。

 1 namespace FacadePattern.Implementation1
 2 {
 3   public abstract class Facade
 4   {
 5     public abstract void Operation();
 6   }
 7
 8   public class ConcreteFacade : Facade
 9   {
10     public override void Operation()
11     {
12       // we could use any factory here
13       // or use IoC here
14       SubsystemClassA subsystemClassA = new SubsystemClassA();
15       SubsystemClassB subsystemClassB = new SubsystemClassB();
16
17       subsystemClassA.BehaviorA();
18       subsystemClassB.BehaviorB();
19     }
20   }
21
22   public class SubsystemClassA
23   {
24     public void BehaviorA()
25     {
26       // do something
27     }
28   }
29
30   public class SubsystemClassB
31   {
32     public void BehaviorB()
33     {
34       // do something
35     }
36   }
37
38   public class Client
39   {
40     public void TestCase1()
41     {
42       Facade facade = new ConcreteFacade();
43       facade.Operation();
44     }
45   }
46 }

《设计模式之美》为 Dennis Gao 发布于博客园的系列文章,任何未经作者本人同意的人为或爬虫转载均为耍流氓。

设计模式之美:Facade(外观)相关推荐

  1. 设计模式笔记 10.Facade 外观模式(结构型模式)

    10. Facade 外观模式      2008-8-18 动机(Motivation) 上述A方案的问题在于组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种 ...

  2. 设计模式10: Facade 外观模式(结构型模式)

    Facade 外观模式(结构型模式) 系统的复杂度 假设我们要开发一个坦克模式系统用于模拟坦克车在各种作战环境中的行为,其中坦克系统由引擎.控制器.车轮.车身等各个子系统构成. internal cl ...

  3. 设计模式学习之---Facade(外观)模式

    1.Facade外观模式,是一种接口型模式.这种模式的目的在于,它为子系统中的一组接口,定义了一个更高层次的接口,通过这个接口,提供一个统一的接口,使子系统更加容易使用. 2.实现:创建一个新的类,提 ...

  4. C#设计模式系列 9 ----Facade外观模式之--天河城购物

    1.理论定义 外观模式   把  分散的子系统,集合成一个系统,提供一站式服务. 2.应用举例 需求描述: 聂小倩 和 宁采臣是一对小富则安 的聊斋夫妻.住在比较偏远的小乡村. 今天,两人初次来到大城 ...

  5. 结构型设计模式(2)—— 外观模式(Facade Pattern)

    文章目录 1.概述 2.外观模式的简单应用 3.应用场景 4.优缺点 5.小结 参考文献 1.概述 使用设计模式可以提高代码的可复用性.可扩充性和可维护性.外观模式(Facade Pattern)属于 ...

  6. 设计模式之Facade(外观 总管 Manager)

    Facade模式的定义 : 为子系统中的一组接口提供一个一致的界面. Facade一个典型应用就是数据库JDBC的应用,如下例对数据库的操作: public class DBCompare {Conn ...

  7. 设计模式之美总结(结构型篇)

    title: 设计模式之美总结(结构型篇) date: 2022-12-21 09:59:11 tags: 设计模式 categories: 设计模式 cover: https://cover.png ...

  8. 本人亲自整理的极客时间设计模式之美下部的硬核笔记(残缺版)最近加班太多,搞不了太多,只能尽量了xd们

    设计模式之美(下)https://www.yuque.com/zcming123/uygxde/cbwnad 这位猿,三连,再走吧! 以下内容是为了让搜索引擎,检测到这篇文章.要阅读体验,请点击上面的 ...

  9. 设计模式之美总结(设计原则篇)

    title: 设计模式之美总结(设计原则篇) date: 2022-10-27 17:31:42 tags: 设计模式 categories: 技术书籍及课程 cover: https://cover ...

最新文章

  1. 【RAY TRACING THE REST OF YOUR LIFE 超详解】 光线追踪 3-5 random direction ONB
  2. 信息安全系统设计基础第九周总结
  3. javascript操作符之new 也疯狂 (2)
  4. 第七十六期:3000台服务器不宕机,微博广告系统全景运维大法
  5. java序列化的方法_【Java常见序列化与反序列方法总结】
  6. 虚机不能启动的特例思考
  7. 【linux高级程序设计】(第八章)进程管理与程序开发 4
  8. 【UVA10256】The Great Divide(凸包相离判定)
  9. 利用python处理excel文件并可视化处理-python如何将excel数据处理可视化
  10. 单片机c语言最容易上手的教程,最好的单片机C语言快速入门教程.doc
  11. 流量用起来不要钱 | 立即打卡潮人好物,免流量再送2年网易云音乐黑胶VIP
  12. w10 http基本原理 Nginx部署
  13. OpenCV-Python图片叠加与融合,cv2.add与cv2.addWeighted的区别
  14. 多米诺骨牌最长牌阵java_棋盘的完美覆盖(多米诺骨牌完美覆盖)幻方(魔方阵)...
  15. 黑科技新添成员, 小米mix5再次创新, 但这些真的只是黑科技的全部吗?
  16. H.264中NALU、RBSP、SODB的关系 (弄清码流结构)
  17. C++实现求最大访客数
  18. 英语从句精简分类讲述
  19. Final Cut Pro X 10.4.8 Apple出品的专业视频非线性编辑软件
  20. 第17家图商名落宽凳,正式获导航电子地图制作甲级资质

热门文章

  1. 为jqgrid添加统计金额页脚
  2. maven创建webapp项目
  3. HTML5 实现手机拍照上传
  4. git for windows
  5. SUPPORTDIR引用的文件的加入
  6. objective-c 面试题
  7. web开发工程师出路
  8. Servet映射规范翻译
  9. java教学笔记_java学习笔记(一)
  10. ELK/EFK — 安装部署(主机安装)