10. Facade 外观模式      2008-8-18

动机(Motivation)

上述A方案的问题在于组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战。

如何简化外部客户程序和系统间的交互接口?如何将外部客户程序的演化和内部子系统的变化之间的依赖相互解耦?

意图(Intent)

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

基本代码:

子系统类:

    class SubSystemOne
    {
        public void MethodOne()
        {
            Console.WriteLine("子系统方法一");
        }
    }

class SubSystemTwo
    {
        public void MethodTwo()
        {
            Console.WriteLine(" 子系统方法二");
        }
    }

class SubSystemThree
    {
        public void MethodThree()
        {
            Console.WriteLine(" 子系统方法三");
        }
    }

class SubSystemFour
    {
        public void MethodFour()
        {
            Console.WriteLine(" 子系统方法四");
        }
    }

Facade类:

    class Facade
    {
        SubSystemOne one;
        SubSystemTwo two;
        SubSystemThree three;
        SubSystemFour four;

public Facade()
        {
            one = new SubSystemOne();
            two = new SubSystemTwo();
            three = new SubSystemThree();
            four = new SubSystemFour();
        }

public void MethodA()
        {
            Console.WriteLine("\n方法组A() ---- ");
            one.MethodOne();
            two.MethodTwo();
            four.MethodFour();
        }

public void MethodB()
        {
            Console.WriteLine("\n方法组B() ---- ");
            two.MethodTwo();
            three.MethodThree();
        }
    }

客户端代码:

    class Program
    {
        static void Main(string[] args)
        {
            Facade facade = new Facade();

facade.MethodA();
            facade.MethodB();

Console.Read();
        }
    }

Facade的几个要点:

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

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

Façade设计模式并非一个集装箱,可以任意地放进任何多个对象。Façade模式中组件的内部应该是“相互耦合关系比较大的一系列组件”,而不是一个简单的功能集合。

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

适用性:

1.为一个复杂子系统提供一个简单接口。

2.提高子系统的独立性。

3.在层次化结构中,可以使用Facade模式定义系统中每一层的入口。

转载于:https://www.cnblogs.com/MaoBisheng/archive/2008/08/18/1270604.html

设计模式笔记 10.Facade 外观模式(结构型模式)相关推荐

  1. [导入]C#面向对象设计模式纵横谈(10):Decorator 装饰模式(结构型模式).zip(9.84 MB)...

    讲座内容: 本培训课程探讨GoF23之Decorator 装饰模式的意图.动因.原理.应用场景与C#语言实现,以及该模式在.NET框架程序设计中的具体应用. 课程讲师: 李建忠 上海祝成信息科技有限公 ...

  2. 享元模式 - 结构型模式

    模式类型:     Flyweight   享元模式 - 结构型模式 意图:     The intent of this pattern is to use sharing to support a ...

  3. Java设计模式学习总结(12)——结构型模式之外观模式

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

  4. 【设计模式】设计模式总结 ( 七大设计原则 | 创建型模式 | 结构型模式 | 行为型模式 ) ★★★

    文章目录 一.七大设计原则 1.开闭原则 2.依赖倒置原则 3.单一职责原则 4.接口隔离原则 5.迪米特原则 6.里氏替换原则 7.合成复用原则 二.创建型模式 0.简单工厂模式 ( 不属于 GOF ...

  5. Java设计模式学习总结(7)——结构型模式之适配器模式

    适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能.这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口 ...

  6. Java设计模式学习总结(14)——结构型模式之代理模式

    在代理模式(Proxy Pattern)中,一个类代表另一个类的功能.这种类型的设计模式属于结构型模式.在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口. 介绍 意图:为其他对象提供一 ...

  7. Java设计模式学习总结(13)——结构型模式之享元模式

    享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式.享元模式尝试 ...

  8. Java设计模式学习总结(11)——结构型模式之装饰器模式

    装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装.这种模式创建了一个装饰类,用来包装原 ...

  9. Java设计模式学习总结(9)——结构型模式之过滤器模式(标准模式)

    过滤器模式( Filter Pattern )或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来.这 ...

最新文章

  1. MySQL5.7的date类型_Mysql5.7 虚拟列数据类型为DATE时,如何存入数据?
  2. SpringMVC js如何获取后台model中的属性值
  3. Linux chkconfig命令详解
  4. 重构alert,confirm
  5. 【原创】MySQL里求给定的时间是所在月份的第几个礼拜
  6. c#引用参数ref与输出参数out
  7. OpenCV身份证离线识别技术实战(一)
  8. java课设模板_java课程设计模板
  9. .NET程序员我是如何通过一个产品在2年内买车买房
  10. 计算机提示pdf不能加载,打开电脑中的PDF文档无法显示内容提示Please wait怎么解决...
  11. 室内地图制作软件,怎么制作电子地图?
  12. Enterprise Architect安装包及教程
  13. SuperMap iServer11i新功能----图例的发布和使用
  14. matlab2014启动很慢,[转载]matlab启动慢的解决方法
  15. Saiku-ui代码结构分析
  16. STM32 HAL库学习笔记1-HAL库简介
  17. 多链跨链、高可用、高安全性的区块链应用如何落地? 金链盟大赛10强揭晓
  18. CSS样式让图片旋转
  19. 移动互联网未来发展的五大趋势
  20. vue中npm引入editor.md编辑器插件

热门文章

  1. 决策树c语言程序代码,R C5.0 决策树c50代码,名为 exit 1_r_开发99编程知识库
  2. 秘钥对使用_使用gitactions持续集成项目实例
  3. 第二章:2.4 卷积性质
  4. 第四讲 一阶线性ODE换元法
  5. PyTorch中MaxPool的ceil_mode属性
  6. 【Codeforces 986B】Petr and Permutations
  7. scrum敏捷开发工具leangoo如何添加成员
  8. SQL Server 2005 Express
  9. 玩转Autorun.inf
  10. UA MATH565C 随机微分方程I SDE的定义与例子