动机:

组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战。如何简化外部客户程序和系统间的交互接口?如何将外部客户程序的演化和内部子系统的变化之间的依赖相互解耦?

意图:

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

——《设计模式》GoF

结构:

 

代码结构

   1: using System;

   2:  

   3: namespace GangOfFour.Facade.Structural

   4: {

   5:   /// <summary>

   6:   /// MainApp startup class for Structural

   7:   /// Facade Design Pattern.

   8:   /// </summary>

   9:   class MainApp

  10:   {

  11:     /// <summary>

  12:     /// Entry point into console application.

  13:     /// </summary>

  14:     public static void Main()

  15:     {

  16:       Facade facade = new Facade();

  17:  

  18:       facade.MethodA();

  19:       facade.MethodB();

  20:  

  21:       // Wait for user

  22:       Console.ReadKey();

  23:     }

  24:   }

  25:  

  26:   /// <summary>

  27:   /// The 'Subsystem ClassA' class

  28:   /// </summary>

  29:   class SubSystemOne

  30:   {

  31:     public void MethodOne()

  32:     {

  33:       Console.WriteLine(" SubSystemOne Method");

  34:     }

  35:   }

  36:  

  37:   /// <summary>

  38:   /// The 'Subsystem ClassB' class

  39:   /// </summary>

  40:   class SubSystemTwo

  41:   {

  42:     public void MethodTwo()

  43:     {

  44:       Console.WriteLine(" SubSystemTwo Method");

  45:     }

  46:   }

  47:  

  48:   /// <summary>

  49:   /// The 'Subsystem ClassC' class

  50:   /// </summary>

  51:   class SubSystemThree

  52:   {

  53:     public void MethodThree()

  54:     {

  55:       Console.WriteLine(" SubSystemThree Method");

  56:     }

  57:   }

  58:  

  59:   /// <summary>

  60:   /// The 'Subsystem ClassD' class

  61:   /// </summary>

  62:   class SubSystemFour

  63:   {

  64:     public void MethodFour()

  65:     {

  66:       Console.WriteLine(" SubSystemFour Method");

  67:     }

  68:   }

  69:  

  70:   /// <summary>

  71:   /// The 'Facade' class

  72:   /// </summary>

  73:   class Facade

  74:   {

  75:     private SubSystemOne _one;

  76:     private SubSystemTwo _two;

  77:     private SubSystemThree _three;

  78:     private SubSystemFour _four;

  79:  

  80:     public Facade()

  81:     {

  82:       _one = new SubSystemOne();

  83:       _two = new SubSystemTwo();

  84:       _three = new SubSystemThree();

  85:       _four = new SubSystemFour();

  86:     }

  87:  

  88:     public void MethodA()

  89:     {

  90:       Console.WriteLine("\nMethodA() ---- ");

  91:       _one.MethodOne();

  92:       _two.MethodTwo();

  93:       _four.MethodFour();

  94:     }

  95:  

  96:     public void MethodB()

  97:     {

  98:       Console.WriteLine("\nMethodB() ---- ");

  99:       _two.MethodTwo();

 100:       _three.MethodThree();

 101:     }

 102:   }

 103: }

Output

 

 

Facade模式的几个要点

• 从客户程序的角度来看, Facade模式不仅简化了整个组件系统的接口,同时对于组件内部与外部客户程序来说,从某种程度上也达到了一种“解耦”的效果——内部子系统的任何变化不会影响到Façade接口的变化。

• Façade设计模式更注重从架构的层次去看整个系统,而不是单个类的层次。Façade很多时候更是一种架构设计模式。

• 注意区分Façade模式、Adapter模式、Bridge模式与Decorator模式。Façade模式注重简化接口,Adapter模式注重转换接口,Bridge模式注重分离接口(抽象)与其实现,Decorator模式注重稳定接口的前提下为对象扩展功能。

设计模式学习之路——Facade 外观模式(结构型模式)的更多相关文章

  1. 设计模式学习之适配器模式(Adapter,结构型模式)(14)

    参考链接:http://www.cnblogs.com/zhili/p/AdapterPattern.html一.定义:将一个类的接口转换成客户希望的另一个接口.Adapter模式使得原本由于接口不兼 ...

  2. Facade 外观(结构型)

    Facade 外观(结构型) 一:描述: Facade 外观模式是为子系统至客户端之间提供简单的一致的接口,来降低耦合度. 二:模式图 三:实现代码简单例子: 1.业务模块: 2.外观接口: 3.客户 ...

  3. 设计模式之美:Structural Patterns(结构型模式)

    结构型模式涉及到如何组合类和对象以获得更大的结构. 结构型类模式采用继承机制来组合接口实现. 结构型对象模式不是对接口和实现进行组合,而是描述了如何对一些对象进行组合,从而实现新功能的一些方法. 因为 ...

  4. 设计模式(十二): Flyweight享元模式 -- 结构型模式

    说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释放.我们只是为了学习而简单做了介绍. 1. 概述 面 ...

  5. 代理模式/proxy模式/结构型模式

    代理模式proxy 定义 为其他对象提供一种代理,并以控制对这个对象的访问.最简单的理解,买东西都是要去商店的,不会去工厂. java实现三要素 proxy(代理)+subject(接口)+realS ...

  6. 设计模式(十一):FACADE外观模式 -- 结构型模式

    1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性.例子1:一个电源总开关可以控制四盏灯.一个风扇 ...

  7. 设计模式(十):Decorator装饰者模式 -- 结构型模式

    1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继 ...

  8. 设计模式(七):Adapter 适配器模式 -- 结构型模式

    1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题.程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相关库的发展和进化.  例子1:iphone4,你即可以 ...

  9. 设计模式(十三): Proxy代理模式 -- 结构型模式

      设计模式(十一)代理模式Proxy(结构型) 1.概述 因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路 ...

随机推荐

  1. iOS-提高iOS开发效率的方法和工具

    提高iOS开发效率的方法和工具 介绍 这篇文章主要是介绍一下我在iOS开发中使用到的一些可以提升开发效率的方法和工具. IDE 首先要说的肯定是IDE了,说到IDE,Xcode不能跑,当然你也可能同时 ...

  2. iOS-iOS开发简单介绍

    概览 终于到了真正接触IOS应用程序的时刻了,之前我们花了很多时间去讨论C语言.ObjC等知识,对于很多朋友而言开发IOS第一天就想直接看到成果,看到可以运行的IOS程序.但是这里我想强调一下,前面的 ...

  3. Clash Detection

    Clash Detection eryar@163.com Abstract. Clash detection is used for the model collision check. The p ...

  4. 基于X86平台的PC机通过网络发送一个int(32位)整数的字节顺序

    1.字节顺序 字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端.大端两种字节顺序.小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处:大端字节序是高字节数据存 ...

  5. .Net 转战 Android 4.4 日常笔记(7)--apk的打包与反编译

    apk(android package)就是我们安卓系统的安装文件,可以在模拟器和手机中直接打开安装,从项目中打包apk有几种方式可取 一.最简单的方法(类似我们的winfrom) 只要我们调试或者运 ...

  6. php继承多态

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. Javascript对象的方法赋值

    Javascript对象编程学习中,一直不能很好的掌握对象的属性(property)和方法(method).今天在写代码过程中,又犯了一个低级错误. <!DOCTYPE html> < ...

  8. Rust初步(四):在rust中处理时间

    这个看起来是一个很小的问题,我们如果是在.NET里面的话,很简单地可以直接使用System.DateTime.Now获取到当前时间,还可以进行各种不同的计算或者输出.但是这样一个问题,在rust里面, ...

  9. javascript模拟继承

    javascript作为前端开发的标配技能,如果不掌握好它的三大特点:1.原型 2.作用域 3. 闭包 ,又怎么可以说你学好了这门语言呢?如果标配的技能都没有撑握好,怎么可以任性的玩耍呢?怎么验证自己 ...

  10. reflow和repaint(摘录自张鑫旭的翻译)

    //正文开始 关于回流(reflows)与重绘(repaints),我已经在twitter和delicious上发布,但是并没有在演讲中提到或是以文章形式发布. 第一次让我开始思考关于回流(reflo ...