本文是对面向对象设计模式-外观模式(Facade)的学习整理总结与练习,主要分为模式定义、学习要点整理、多案例练习加深对模式的理解、最后总结知识要点。

第一篇:模式定义

外观模式是GoF四人帮整理的《设计模式-可复用面向对象软件基础》一书中23种设计模式中归类为结构型模式中的设计模式,23种设计模式根据它们的用途分为三大类:5种创建型模式、7种结构型模式、11种行为型模式。

外观模式:

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

外观模式其目的就是为了给一个子系统中的一组接口提供一个统一的接口,通过这个接口让客户与子系统进行解耦且更容易使用子系统中的接口。通过外观模式还可以保护子系统中的接口,子系统中的接口对客户来说是透明的,只有外观中实现的接口才开放给客户使用。

第二篇:学习要点整理

外观模式是一个要改变接口的模式,它改变接口的原因是为了简化接口。之所以称为外观模式,是因为它将一个或数个类的复杂的一切都隐藏在背后,只显露出一个干净美好的外观。

家庭影院案例

我们准备建立一个家庭影院(Amplifier),经过研究,需要包含DVD播放器(DvdPlayer)、投影机、自动屏幕(Screen)、环绕立方体声,甚至还有爆米花机。经过几个星期的安装,终于完成了,现在准备开始享受一部电影。但是,想看电影,必须要先执行一些任务:1、打开爆米花机2、开始爆米花3、将灯光调暗4、放下屏幕5、打开投影机6、将投影机的输入切换到DVD7、将投影机设置在宽屏模式8、打开功放9、将功放的输入设置为DVD10、将功放设置为环绕立体声11、将功放音量调到中12、打开DVD播放器13、开始播放DVD。

不只这样,看完电影后,还要把一切都关掉。怎么办?

你需要的正是一个外观:通过实现一个提供更合理的接口外观类,你可以将一个复杂的子系统变得容易使用。如果你需要复杂子系统的详细接口,还是可以使用原来的复杂接口。

通过外观类,客户代码可以调用家庭影院外观类所提供的方法,而不必再调用这个子系统的方法。想要看电影只需要调用watchMovid()方法即可。灯光、DVD、投影机、功放、屏幕等一键搞定。

外观模式只是提供更直接的操作,并未将原来的子系统阻隔起来。如果需要子系统类的更高层功能,还是可以使用原来的子系统。

外观模式

使用外观模式,需要创建一个接口简化而统一的类,用来包装子系统中一个或多个复杂的类。

外观模式允许我们让客户和子系统之间避免紧耦合。

外观模式:提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。

外观(Facade)角色 :客户端可以调用这个角色的方法。此角色知晓相关的(一个或者多个)子系统的功能和责任。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去。

子系统(SubSystem)角色 :可以同时有一个或者多个子系统。每个子系统都不是一个单独的类,而是一个类的集合。

每个子系统都可以被客户端直接调用,或者被外观角色调用。子系统并不知道外观的存在,对于子系统而言,外观仅仅是另外一个客户端而已。

最少知识原则

最少知识原则告诉我们要减少对象之间的交互,只留下几个“密友”。只和你的密友交谈。

当你正在设计一个系统,不管是任何对象,你都要注意它所交互的类有哪些,并注意它和这些类是如何交互的。

这个原则希望我们在设计中,不要让太多的类耦合在一起,免得修改系统中一部分,会影响到其它部分。如果许多类之间相互依赖,那么这个系统就会变成一个易碎的系统,它需要花许多成本维护,也会因为太复杂而不容易被其他人了解。

如何不要赢得太多的朋友和影响太多的对象?

这个原则提供了一些方针:就任何对象而言,在该对象的方法内,我们只应该调用属于以下范围的方法:1)该对象本身2)被当做方法的参数而传递进来的对象3)此方法所创建或实例化的任何对象4)对象的任何组件。

如果某对象是调用其他的方法返回结果,不要调用该对象的方法。

最少知识原则缺点:采用这个原则也会导致更多的“包装”类被制造出来,以处理和其他组件的沟通,这可能会导致复杂度和开发时间的增并降低运行时的性能。

第三篇:案例实践

练习案例源码:https://github.com/chentian114/100-dayaction/tree/master/designpattern-1

FacadeDemo外观模式案例:

外观模式类图实现案例;Facade类其实相当于A、B、C模块的外观界面,有了这个Facade类,那么客户端就不需要亲自调用子系统中的A、B、C模块了,也不需要知道系统内部的实现细节,甚至都不需要知道A、B、C模块的存在,客户端只需要跟Facade类交互就好了。从而更好地实现了客户端和子系统中A、B、C模块的解耦,让客户端更容易地使用系统。

HospitalDemo医院案例:

一个医院有不同的职能部门:挂号、门诊、划价、化验、收费、取药等。病人看病需要和这些部门打交道, 首先必须先挂号,然后门诊。如果医生要求化验,病人必须先缴费,然后化验。再回门诊药生开药,再缴费再取药。

需求分析:一个医院相当于一个子系统,病人挂号、门诊等相当于与子系统中的各个类打交道。 病人要与诸多部门打交道不是一件容易的事,尤其是初次到医院的不知道各部门在什么地方。 在面向对象中病人类直接与子系统的类打交道会让病人类高耦合,依赖的类太多。 解决方法:医院会设置一个前台接待员角色,给病人做指引。 在面向对象中通过引入门面模式,用一个门面类引用子系统中的所有类,提供一个公共的接口, 所有病人都只依赖门面类,通过门面类去和子系统中的各个类打交道。

HomeTheaterDemo家庭电影院案例:

一个家庭影院(Amplifier),经过研究,需要包含DVD播放器(DvdPlayer)、投影机、自动屏幕(Screen)、环绕立方体声,甚至还有爆米花机。 想看电影,必须要先执行一些任务:1、打开爆米花机2、开始爆米花3、将灯光调暗4、放下屏幕5、打开投影机 6、将投影机设置在宽屏模式7、打开功放8、将功放设置为环绕立体声9、将功放音量调到中10、打开DVD播放器11、开始播放DVD。

通过实现一个提供更合理的接口外观类,你可以将一个复杂的子系统变得容易使用。 门面对象是外界访问子系统内部的唯一通道. 一般情况下,门面角色会将所有从客户端发来的请求委派到相应的子系统去,也就说该角色没有实际的业务逻辑,只是一个委托类。

第四篇:总结

使用门面模式还有一个附带的好处,就是能够有选择性地暴露方法。

一个模块中定义的方法可以分成两部分,一部分是给子系统外部使用的,一部分是子系统内部模块之间相互调用时使用的。

外观和适配器可以包装许多类,但是外观的意图是简化接口,而适配器的意图是将接口转换成不同的接口。

优点:

1)减少系统的相互依赖;外界对象不需要依赖子系统内部类。

2)提高了灵活性;只要子系统的变化不影响到门面对象,外界便不需要发生变化。

3)提高安全性;外界只能访问门面上开通的方法。

4)简单易用;门面模式让子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要跟众多子系统内部的模块进行交互,只需要跟门面类交互就可以了。

5)更好的划分访问层次;通过合理使用Facade,可以帮助我们更好地划分访问的层次。有些方法是对系统外的,有些方法是系统内部使用的。

缺点:

1)不符合开闭原则,可能需要修改门面角色代码。

2)外观类高耦合,一旦有变更,只能对外观类进行修改。修改外观类需要非常谨慎。

使用场景:

3)为一个复杂的模块或子系统提供一个外界访问的接口。当需要简化并统一一个很大的接口或者一群复杂的接口时,使用外观。

4)子系统相对独立,外界对子系统只要黑箱操作即可。

注意事项:

1)一般情况一个子系统只需要一个门面即可;当门面庞大到不能忍受可以进行拆分或者提供不同的访问接口可以创建多个门面。

2)门面不参与子系统内的业务逻辑,当某个业务涉及到子系统中多个类时,可以建立一个封装类,封装后提供给门面类调用。

设计模式8-外观模式(Facade)总结整理与练习相关推荐

  1. 如何让孩子爱上设计模式 ——11.外观模式(Facade Pattern)

    如何让孩子爱上设计模式 --11.外观模式(Facade Pattern) 标签: 设计模式初涉 场景引入 相信各位玩过LOL英雄联盟游戏的童鞋,对下面两个英雄都不会陌生吧:       分别是瑞雯和 ...

  2. 研磨设计模式之外观模式(Facade)(解决方案)

    3.2  解决方案 3.2.1  外观模式来解决 用来解决上述问题的一个合理的解决方案就是外观模式.那么什么是外观模式呢? (1)外观模式定义 这里先对两个词进行一下说明,一个是界面,一个是接口. 界 ...

  3. php facade模,PHP 设计模式之外观模式 Facade

    简单描述 外观模式(Facade pattern),为子系统中的一组接口提供一个统一的高层接口,使得子系统更容易使用. 外观模式又称为门面模式,它是一种对象结构型模式,遵循迪米特法则,又称最少知道原则 ...

  4. 设计模式之外观模式(Facade)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  5. 【设计模式】—— 外观模式Facade

    前言:[模式总览]----------by xingoo 模式意图 外观模式主要是为了为一组接口提供一个一致的界面.从而使得复杂的子系统与用户端分离解耦. 有点类似家庭常用的一键开关,只要按一个键,台 ...

  6. 【白话设计模式二】外观模式(Facade)

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...

  7. 外观模式(Facade)----设计模式

    外观模式(Facade)----设计模式 文章目录 外观模式(Facade)----设计模式 什么是外观模式呢? 外观模式的基本介绍 制造一个影院管理? 实现代码 总结 什么是外观模式呢? 以我们中常 ...

  8. 设计模式:外观模式(Facade)

    外观模式(Facade)也叫过程模式, 外观模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 外观模式通过定义一个一致的接口,用以屏蔽内部子系 ...

  9. 设计模式 -结构型模式_门面模式(外观模式) Facade Pattern 在开源软件中的应用

    文章目录 Pre 定义 案例 Demo V1.0 Boss直接管理 V2.0 引入外观类 PmManagerFacade 何时使用Facade Tomcat Mybatis Pre 我们先来回顾下门面 ...

最新文章

  1. 备库中ORA-00600错误的简单修复
  2. nginx 安装与配置
  3. python适合零基础的人吗_学Python需要什么基础知识?零基础可以学Python吗?
  4. odoo10学习笔记十四:mixin其他功能模块
  5. CMake使用介绍(2)
  6. 【今日CV 计算机视觉论文速览 第126期】Thu, 6 Jun 2019
  7. [笔记] 运维管理 - 压力测试 和 DDOS 防攻击
  8. 推荐Java学习书籍
  9. PHPCMS之 列表和内容页
  10. selenium常用方法
  11. fckeditor php 不显示,PHP Fckeditor上传文件(或图片)中文显示为乱码的解决方法
  12. zepto.js学习
  13. 计算机维修需要什么工具,一种计算机维修工具的制作方法
  14. 调用函数,判断一个数是否为素数
  15. java8-stream示例
  16. ! [rejected] master - master (fetch first)问题的解决方案
  17. 笔记本电脑无法连接WiFi,如何解决
  18. 力扣242.有效的字母异位词(Java语言,排序法、散列表法)
  19. SAAS(软件即服务) 离我们还有多远?
  20. 群晖3617可以有几个网卡_Nvme pcie千兆有线网卡

热门文章

  1. java计算机毕业设计家电产品售后(附源码、数据库)
  2. MobData“1024程序趴”今天所有程序猿都有妹纸!
  3. 在怀俄明大学天气数据网站下载探空数据详细步骤
  4. FPGA:双线轨丝杠式升降台(及A4988与42步进电机原理)(同时包含51及32程序)
  5. 使用Mac抓取iPhone数据包(二.RVI)
  6. 数学建模血管的三维重建
  7. 分享!50个超级常见的投标书错误,你都清楚了吗?
  8. Shell编程中的case in语句
  9. 逝去的 2020,帅地期待过,也曾迷茫过...
  10. 统计套利策略的五大主流策略分析与优缺点