动机:有些系统组件的客户和组件中各种复杂的子系统有了过多的的耦合,随着外部客户程序
  和个子系统的演化,这种过多的耦合面临很多变化的挑战;如何简化外部客户程序和系统的交互接口?
  如何将外部客户程序的演化和内部子系统的变化之间的依赖相互解耦
 意图:为子系统的一组接口提供一个一致的界面,Facade模式定义了了一个高层接口,这个接口使得这一子系统更加
 容易使用

 可适用性:
1、当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会
 产生更多更小的类。这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用
 户带来一些使用上的困难。Facade可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那
 些需要更多的可定制性的用户可以越过Facade层。 
2、客户程序与抽象类的实现部分之间存在着很大的依赖性。引入Facade将这个子系统与客户以及其他的子系统
 分离,可以提高子系统的独立性和可移植性。 
3、当你需要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点。如果子系统之间是相
 互依赖的,你可以让它们仅通过Facade进行通讯,从而简化了它们之间的依赖关系。

UML图解:

示例:假设我们需要开发一个坦克模拟系统用于模拟坦克车在各种作战环境中的行为,其中坦克系统由引擎、控制器、车轮、车身等各种子系统构成。

代码如下:

namespace Facade
{ /// <summary>
/// 车轮
/// </summary>
public class Wheel
{
public void WAction1()
{ }
public void WAction2()
{ }
} /// <summary>
/// 引擎
/// </summary>
public class Engine
{
public void EAction1()
{ }
public void EAction2()
{ }
} /// <summary>
/// 控制器
/// </summary>
public class Controler
{
public void CAction1()
{ }
public void CAction2()
{ } } /// <summary>
/// 车身
/// </summary>
public class Bodywork
{
public void BAction1()
{ }
public void BAction2()
{ }
}
/*假设将以上每个类看做是各个子系统的话,下面就用Facade模式设计一个高层的系统*/ /// <summary>
/// 设计好TankFacade类,这样就可以将系统解耦,我们使用坦克时并不需要关注其引擎、控制器、车轮、
/// 车身具体怎么工作的我们只需要知道坦克能做什么就可以,TankFacade类简化了客户程序使用的复杂性
/// ,也同时隐藏了子系的内部实现,以对象组合的方式来达到解耦的目的;虽然子系统和TankFacade同在
/// 一个DLL里,但客户程 序只能透过TankFacade类来使用各个子系统的功能
/// </summary>
public class TankFacade
{
Wheel[] wheels=new Wheel[4];
Engine[] engines = new Engine[4];
Bodywork body = new Bodywork();
Controler control = new Controler();
public void Start()
{
//使用子系统Engine的某些方法...
}
public void Run()
{
//使用子系统Wheel的某些方法...
}
public void Shot()
{
//....
}
public void Stop()
{
//....
}
}
}

面向对象设计模式之Facade外观模式(结构型)的更多相关文章

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

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 外观模式提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更容易使 ...

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

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

  3. 设计模式学习之路——Facade 外观模式(结构型模式)

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

  4. Facade 外观(结构型)

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

  5. 设计模式(7)--Bridge(桥接模式)--结构型

    1.模式定义: 桥接模式是对象的结构模式.又称为柄体(Handle and Body)模式或接口(Interface)模式.桥接模式的用意是“将抽象化(Abstraction)与实现化(Impleme ...

  6. 设计模式(9)--Composite(组合模式)--结构型

    1.模式定义: 组合模式属于对象的结构模式,有时又叫做“部分——整体”模式.组合模式将对象组织到树结构中,可以用来描述整体与部分的关系.组合模式可以使客户端将单纯元素与复合元素同等看待. 2.模式特点 ...

  7. 设计模式(12)--Proxy(代理模式)--结构型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. ...

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

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

  9. (转载)设计模式学习笔记(十一)——Facade外观模式

    (转载)http://www.cnblogs.com/kid-li/archive/2006/07/10/446904.html Facade外观模式,是一种结构型模式,它主要解决的问题是:组件的客户 ...

随机推荐

  1. (转载)遍历memcache中已缓存的key

    (转载)http://www.cnblogs.com/ainiaa/archive/2011/03/11/1981108.html 最近需要做一个缓存管理的功能.其中有一个需要模糊匹配memcache ...

  2. Binary Tree Preorder Traversal —— LeetCode

    Given a binary tree, return the preorder traversal of its nodes' values. For example:Given binary tr ...

  3. vtk 中文显示

    参考文章: http://www.vislab.cn/bbs/viewthread.php?tid=5079&page=1&extra=#pid19477 http://tieba.b ...

  4. [Locked] Factor combinations

    Numbers can be regarded as product of its factors. For example, 8 = 2 x 2 x 2; = 2 x 4. Write a func ...

  5. G - Supermarket poj1456

    题目的描述很长,其实描述的问题很简单,说有n的商品,它们每个的价值是pi,但是呢,再过di天这些商品就不能卖了(有可能过期了...),现在给出来每个商品的价值和可以卖的最后期限,问可以得到最多多少资金 ...

  6. C++中的类和对象(一)

    一,类的概念及封装 1.什么是封装 第一层含义:封装是面向对象程序设计最基本的特性.把数据(属性)和函数(方法)合成一个整体,这在计算机世界中是用类和对象实现的.(把属性和方法进行封装) 第二层含义: ...

  7. php中应该哪怕被打断腿都要记得的几个函数

    php中应该哪怕被打断腿都要记得的几个函数: substr() 截取字符串 : explode() 使用一个字符串分割另一个字符串 : implode() 将数组用预定的字符连接成字符串: 下面有一个 ...

  8. PHP安全编程:更优的会话数据安全 更好地防范session暴露(转)

    当你关注于防止源码的暴露时,你的会话数据只同样存在着风险.在默认情况下,SESSION保存在/tmp目录下.这样做在很多情形下是很方便的,其中之一是所有用户都有对/tmp的写入权限,这样Apache同 ...

  9. 4道过滤菜鸟的iOS面试题

    网上已经有很多针对各种知识点的面试题,面试时有些人未必真正理解也能通过背题看上去很懂.我自己总结了4道面试题,好快速的判断这个人是否是一个合格的工程师,欢迎大家点评. 1.struct和class的区 ...

  10. Python之路,Day12 - 那就做个堡垒机吧

    Python之路,Day12 - 那就做个堡垒机吧   本节内容 项目实战:运维堡垒机开发 前景介绍 到目前为止,很多公司对堡垒机依然不太感冒,其实是没有充分认识到堡垒机在IT管理中的重要作用的,很多 ...