Facade外观模式,是一种结构型模式,它主要解决的问题是:组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战。在这里我想举一个例子:比如,现在有一辆汽车,我们(客户程序)要启动它,那我们就要发动引擎(子系统1),使四个车轮(子系统2)转动。但是实际中我们并不需要用手推动车轮使其转动,我们踩下油门,此时汽车再根据一些其他的操作使车轮转动。油门就好比系统给我们留下的接口,不论汽车是以何种方式转动车轮,车轮变化成什么牌子的,我们要开走汽车所要做的还是踩下油门。

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

Façade外观模式的结构大概是这样的:

      这个图是我对Facade模式的理解,如果大家觉得有什么不对的地方欢迎给我指出。

我就上面说的那个情形写一下实现代码,首先我们要实现三个子系统(Wheel、Engine、Body):

internalclass Engine

{

public string EngineWork()

{

return "BMW's Engine is Working";

}

public string EngineStop()

{

return "BMW's Engine is stoped";

}

}

internal class Wheel

{

public string WheelCircumrotate()

{

return "BMW's Wheel is Circumrotating";

}

public string WheelStop()

{

return "BMW's Wheel is stoped";

}

}

internal class Body

{

public Wheel[] wheels = new Wheel[4];

public Engine engine = new Engine();

public Body()

{

for (int i = 0; i < wheels.Length; i++)

{

wheels[i] =new Wheel();

}

}

}

然后,我们再来实现汽车的Facade

classCarFacade

{

Body body = new Body();

public void Run()

{

Console.WriteLine(body.engine.EngineWork());

for(int i = 0; i < body.wheels.Length; i++)

{

Console.WriteLine(body.wheels[i].WheelCircumrotate());

}

}

public void Stop()

{

Console.WriteLine(body.engine.EngineStop());

for (int i = 0; i < body.wheels.Length; i++)

{

Console.WriteLine(body.wheels[i].WheelStop());

}

}

}

现在我们来使用客户端程序验证一下,代码如下:

classProgram

{

static void Main(string[] args)

{

CarFacade car = new CarFacade();

car.Run();

car.Stop();

Console.Read();

}

}

执行结果如下;

BMW's Engine is Working

BMW's Wheel is Circumrotating

BMW's Wheel is Circumrotating

BMW's Wheel is Circumrotating

BMW's Wheel is Circumrotating

BMW's Engine is stoped

BMW's Wheel is stoped

BMW's Wheel is stoped

BMW's Wheel is stoped

BMW's Wheel is stoped

正如上面所说:客户端代码(Program)不需要关心子系统,它只需要关心CarFacade所留下来的和外部交互的接口,而子系统是在CarFacade中聚合。

Façade模式的几个要点:

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

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

转自:http://www.cnblogs.com/lancidie/archive/2011/08/12/2135703.html

Facade外观模式相关推荐

  1. 设计模式笔记 10.Facade 外观模式(结构型模式)

    10. Facade 外观模式      2008-8-18 动机(Motivation) 上述A方案的问题在于组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种 ...

  2. 设计模式10: Facade 外观模式(结构型模式)

    Facade 外观模式(结构型模式) 系统的复杂度 假设我们要开发一个坦克模式系统用于模拟坦克车在各种作战环境中的行为,其中坦克系统由引擎.控制器.车轮.车身等各个子系统构成. internal cl ...

  3. 设计模式学习之---Facade(外观)模式

    1.Facade外观模式,是一种接口型模式.这种模式的目的在于,它为子系统中的一组接口,定义了一个更高层次的接口,通过这个接口,提供一个统一的接口,使子系统更加容易使用. 2.实现:创建一个新的类,提 ...

  4. php5.1 facade,php设计模式 Facade(外观模式)

    模式定义:外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加 ...

  5. 设计模式之Facade(外观)模式

    我们通过一个简单的开关电脑模拟程序来说明Facade模式(外观模式) CPU类 public class Cpu {  public void start()  {   system.out.prin ...

  6. [php]php设计模式 Facade(外观模式)

    1 <?php 2 /** 3 * 外观模式 示例 4 * 5 * 为子系统中的一组接口提供一个一致的界面,定义一个高层接口,使得这一子系统更加的容易使用 6 */ 7 class SubSyt ...

  7. Facade(外观模式) 结构型

    外观模式 一.概述 1.结构 2.适用场景 3.优缺点 4.区别 二.实例 一.概述 外观模式是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式.该模式对外有一个统一接 ...

  8. 浅谈Facade外观模式

    一. 基本概念 有些人可能炒过股票,但其实大部分人都不太懂,这种没有足够了解证券知识的情况下做股票是很容易亏钱的,刚开始炒股肯定都会想,如果有个懂行的帮帮手就好,其实基金就是个好帮手,支付宝里就有许多 ...

  9. C#设计模式系列 9 ----Facade外观模式之--天河城购物

    1.理论定义 外观模式   把  分散的子系统,集合成一个系统,提供一站式服务. 2.应用举例 需求描述: 聂小倩 和 宁采臣是一对小富则安 的聊斋夫妻.住在比较偏远的小乡村. 今天,两人初次来到大城 ...

最新文章

  1. 执行高性能任务的强大桌面计算机是,用于高性能任务的强大的桌面计算机是一个______。...
  2. mariadb编译安装流程
  3. Java的技术采⽤用⽣生命周期
  4. mysql在linux下显示花_在Linux 中搭建 Mysql
  5. Socket 多线程FTP软件开发
  6. android.graphics.drawable.Drawable.Callback回调接口
  7. 几个清华和北邮学霸公众号,值得学习
  8. NB-SVM strong linear baseline
  9. xml文件导入wps_电脑中将WPS文档保存为XML格式的方法
  10. Tomcat中使用cookie
  11. 学习嵌入式怎么入门和提高?嵌入式开发教程pdf
  12. 一分钟入门typescript
  13. 买菜总结之三--水果篇
  14. AI应用第一课:支付宝刷脸登录
  15. 科技发展快速,VR、AR概念要怎么区分?
  16. Zhong__Linux服务器word转PDF方案
  17. 罗克韦尔AB PLC RSLogix5000中创建新项目、任务、程序和例程的具体方法和步骤
  18. 零基础雪橇python_python零基础到项目实战-带你装b带你飞,带你冲刺年薪50万
  19. 发现新鲜的画法,文艺极简水彩线描简笔画植物:草叶集(一)
  20. 中专计算机寒假作业,中职计算机寒假作业[优质课资]

热门文章

  1. Docker技术PPT分享给大家
  2. 冒泡排序java实现和分析
  3. 【关于QT QMediaPlayer 打包后不能播放声音(plugins文件问题引起)】
  4. Auto CAD三维图怎么画?cad三维图怎么画教程
  5. Bootstrap的iCheck插件checkbox和radio
  6. Android9怎样安装xposed,EdXposed 在android 9 上的安装和使用
  7. BZOJ4833: [Lydsy1704月赛]最小公倍佩尔数-数论
  8. tabindex的用法
  9. 图的建立——邻接矩阵
  10. [Linux-网络性能测试] -- netperf测试