动机:

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

意图:

为子系统中的一组接口提供一个一致的界面,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. 08. Web大前端时代之:HTML5+CSS3入门系列 ~ QQ空间时间轴

    Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 大前端系列,主要就是使用CSS3.0来实现,注释我已经打 ...

  2. jQuery源码分析系列(33) : AJAX中的前置过滤器和请求分发器

    jQuery1.5以后,AJAX模块提供了三个新的方法用于管理.扩展AJAX请求,分别是: 1.前置过滤器 jQuery. ajaxPrefilter 2.请求分发器 jQuery. ajaxTran ...

  3. C#中的readonly与const的比较

    C#中有两种常量类型,分别为readonly(运行时常量)与const(编译时常量),本文将就这两种类型的不同特性进行比较并说明各自的适用场景.工作原理 readonly为运行时常量,程序运行时进行赋 ...

  4. 用pageGroup.js实现分页功能

    1.html页面中 引入 <link rel="stylesheet" type="text/css" href="/stylesheets/p ...

  5. Android动画学习(一)——Android动画系统框架简介

    2015-11-09补充:Drawable Animation极有可能是Frame Animation 这几天在找工作,面试的时候被问到了Android动画,之前完全没接触过这部分,直接给懵了,当然其 ...

  6. setTimeout与取号机之间的关系

    说到setTimeout写过javascript的伙伴们一定不会陌生,去银行办过存取款业务的伙伴一定对取号机不会陌生.今天群里有个好伙伴在问setTimeout的问题,大伙你一言我一语,讲了很多,可是 ...

  7. 利用免费的Spire.XLS控件制作Excel报表

    我们小组上个季度接手了一个项目其中需要实现创建excel文档的功能,寻找实现这个功能的控件的任务分配给了我,通过百度搜索我找到了一个免费的控件,它是由E-iceblue公司推出的spire.xls控件 ...

  8. C语言 第六章 多重循环练习

    一.循环输入 #include "stdio.h" void main() { char c; do { printf("我告诉你1+1=2\n"); prin ...

  9. (六)WebGIS中地图瓦片在Canvas上的拼接显示原理

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 在之前的五个章节中,我们在第一章节里介绍了WebGIS的基本 ...

  10. DotNet程序集解析

    在.NET Framework框架中,程序集是重用.安全性以及版本控制的最小单元.程序集的定义为:程序集是一个或多个类型定义文件及资源文件的集合.程序集主要包含:PE/COFF,CLR头,元数据,清单 ...