定义:

为子系统的一组接口提供一个统一的入口,从而降低系统之间的耦合度,提高子系统的可用性。外观模式又称为门面模式,是迪米特法则的一个体现,主要目的就是降低耦合。



结构图

  • Facade:抽象外观类,子系统提供的一组接口的抽象定义。客户端仅针对该抽象层进行编程,不需要知道子系统直接的相互作用关系。
  • ConcreteFacade:具体外观类,抽象门面类的具体实现,其中调用子系统的各个类的业务方法,完成接口中定义的业务需求。
  • Subsystems:子系统类,这些类之间存在各种相互依赖关系,并对外提供业务处理功能。

注意:

  • 外观模式并不给系统增加任何新的功能,它仅仅是简化客户端和子系统之间的调用关系。
  • 如果利用抽象外观类,在选择具体抽象外观类的时候可以采用XML加反射的方法来动态地配置。

优点:

  • 对客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,使子系统使用更加容易
  • 子系统的修改对其它子系统不会产生影响,同样也不会影响客户端调用,如果在业务方法没有变的前提下。

适用情况:

  • 当要为访问的一系列复杂的子系统提供一个简单入口时,可以采用外观模式。
  • 客户端和多个子系统之间存在很大的依赖性,引入外观类可以将子系统独立出来,提高子系统的可移植性。
  • 在层次化机构中,用外观模式可以定义每个层次的入口,层与层之间不产联系,而是通过外观建立联系,降低层之间的耦合度。

实例:

FacadePattern

七个结构模式之外观模式(Facade Pattern)的更多相关文章

  1. Java门面模式(或外观模式)

    门面模式(或外观模式)隐藏系统的复杂性,并为客户端提供一个客户端可以访问系统的接口. 这种类型的设计模式属于结构模式,因为此模式为现有系统添加了一个接口以隐藏其复杂性.门面模式涉及一个类,它提供客户端 ...

  2. 一天学习两个设计模式之Facade模式(外观模式,结构型模式)

    程序这东西随着时间推移,程序会越来越大,程序中的类越来越多,而且他们之间相互关联,这会导致程序结构变得越来越复杂.因此我们在使用他们时候,必须要弄清楚他们之间的关系才能使用他们. 特别是在调用大型程序 ...

  3. 结构型模式(五) 外观模式(Facade)

    一.动机(Motivate) 在软件系统开发的过程中,当组件的客户(即外部接口,或客户程序)和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战. ...

  4. JAVA设计模式之门面模式(外观模式)

    医院的例子 现代的软件系统都是比较复杂的,设计师处理复杂系统的一个常见方法便是将其“分而治之”,把一个系统划分为几个较小的子系统.如果把医院作为一个子系统,按照部门职能,这个系统可以划分为挂号.门诊. ...

  5. GoF23种设计模式之结构型模式之外观模式

    一.概述         为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 二.适用性 1.当你要为一个复杂子系统提供一个简单接口的时候.子系统 ...

  6. 【设计模式最终总结】桥接模式 VS 外观模式

    差异点 外观模式,是把功能通过一个接口提供出来,方便日后更换实现,或者这种实现可以由多方提供,但同时只用一个.典型例子:@Slf4j 桥接模式,多个维度,每个维度提供一个接口,这些接口集中在一个类中, ...

  7. head first 设计模式笔记7-适配器模式与外观模式

    适配器模式:将一个类的接口,转换成客户期望的另一个接口.适配器让原本接口不兼容的类可以合作无间. 这个模式可以通过创建适配器进行接口转换,让不兼容的接口变成兼容.这可以让客户从实现的接口解耦.如果在一 ...

  8. 设计模式(十一)外观模式(Facade Pattern)

    一.引言 在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化,然而为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 ...

  9. 深入浅出设计模式——外观模式(Facade Pattern)

    模式动机引入外观角色之后,用户只需要直接与外观角色交互,用户与子系统之间的复杂关系由外观角色来实现,从而降低了系统的耦合度. 模式定义外观模式(Facade Pattern):外部与一个子系统的通信必 ...

随机推荐

  1. vue-cli需要的包

    vue-cli需要的包 npm install webpack webpack-dev-server --save-dev npm install vue-loader vue-html-loader ...

  2. 用例设计工具PICT — 输入组合覆盖

    1 成对测试简介 成对测试(Pairwise Testing)又称结对测试.两两测试,是一种正交分析的测试技术.成对组合覆盖这一概念是Mandl于1985年在测试Aad编译程序时提出来的.是当不可能遍 ...

  3. Linux快速入门03-系统管理

    这部分将涉及常用的各类linux命令和一些系统高级管理特性,尤其是shell script的创建,这部分在系统自动化运维时会很有作用. Linux系列文章 快速入门系列--Linux--01基础概念 ...

  4. How to load a local .CSS file & JavaScript resources using iPhone UIWebView Class

    This post will cover the basic setup and creation of an application with web content for iPhone that ...

  5. html5遵循的5个设计原则

    前面的话 实际上,html5并不是由w3c直接制定的,w3c的方向是xhtml2,而不是html5.当xhtml2脱离现实,无法付诸实践时,w3c工作组才将研究方向转向html5.为什么xhtml2从 ...

  6. MYSQL线程池总结(一)

    线程池是Mysql5.6的一个核心功能,对于服务器应用而言,无论是web应用服务还是DB服务,高并发请求始终是一个绕不开的话题.当有大量请求并发访问时,一定伴随着资源的不断创建和释放,导致资源利用率低 ...

  7. Java多线程系列--“JUC集合”05之 ConcurrentSkipListMap

    概要 本章对Java.util.concurrent包中的ConcurrentSkipListMap类进行详细的介绍.内容包括:ConcurrentSkipListMap介绍ConcurrentSki ...

  8. [OpenCV] Samples 04: contours2

    要先变为二值图像:cvThreshold 提取轮廓:cvFindContours #include "opencv2/imgproc/imgproc.hpp" #include & ...

  9. Minimit Anima – 硬件加速的 CSS3 动画插件

    Minimit Anima 是一个实现 CSS3 Transforms 和 Transitions 动画的 jQuery 插件.基于硬件加速的 CSS3 动画执行更快,而且它有一个类似于 jQuery ...

  10. Windows Azure Service Bus (3) 队列(Queue) 使用VS2013开发Service Bus Queue

    <Windows Azure Platform 系列文章目录> 在之前的Azure Service Bus中,我们已经介绍了Service Bus 队列(Queue)的基本概念. 在本章中 ...