结构型模式-外观模式

来源:互联网 发布:青岛搜索引擎排名数据 编辑:程序博客网 时间:2024/05/18 01:45
外观模式(Facade)




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




适用性:

1)当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而
  变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统
  更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系
           统的用户带来一些使用上的困难。
  外观模式可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足
  够,而那些需要更多的可定制性的用户可以越过外观模式层。


2)客户程序与抽象类的实现部分之间存在着很大的依赖性。引入外观模式将这
  个子系统与客户以及其他的子系统分离,可以提供子系统的独立性和可一移
  植性。


3)当你需要构建一个层次结构的子系统时,使用外观模式定义子系统中每层的
  入口点。如果子系统之间是相互依赖的,你可以让它们仅通过外观模式进行
  通讯,从而简化它们之间的依赖关系.




效果:


1)它对客户屏蔽了系统组件,因而减少了客户处理对象的数目并使得子系统使
  用起来更加方便。


2)它实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是
  紧耦合的。松耦合关系使得子系统的组件变化不会影响到它的客户。外观模
  式有助于建立层次结构系统,也有助于对对象之间的依赖关系分层。外观模
  式可以消除复杂的循环依赖关系。这一点在客户程序与子系统是分别实现的
  时候尤为重要。
  在大型软件系统中降低编译依赖性至关重要。在子系统改变时,希望尽量减
  少重编译工作以节省时间。用外观模式可以降低编译性,限制重要系统较小
  的变化所需要的重编译工作。外观模式同样也有利于简化系统在不同平台之
           间的移植过程,因为编译一个子系统一般不需要编译所有其他的子系统。


3)如果应用需要,它并不限制它们使用子系统类。因此你可以在系统易用性和
  通用性之间加以选择。




实现:
使用外观模式时需要注意以下几点:
1)降低客户 - 子系统之间的耦合度  用抽象类实现外观模式而它的具体类对应
  不同的子系统实现,这可以进一步降低客户与子系统的耦合度。这样,客户
  就可以通过抽象的外观模式类接口与子系统通讯。这种抽象耦合关系使得客户
           不知道它使用的是子系统的哪一个实现。
  除生成子类的方法以外,另一种方法是用不同的子系统对象配置外观模式对象。
  为定制外观模式,仅需要对它的子系统对象(一个或多个)进行替换即可。


2)公共子系统类与私有子系统类一个子系统与一个类的相似之处是,他们都
  有接口并且它们都封装了一些东西---类封装了状态和操作,而系统封装了一
           些类。考虑一个类的公共和私有接口是有益的,我们也可以考虑子系统的公共
  和私有接口。
  子系统的公共接口包含所有客户程序可以访问的类;私有接口仅用于对子系统
  进行扩充。当然,外观模式是公共接口的一部分,但它不是唯一的部分,子系
           统的其他部分通常也是公共的。例如,编译子系统中的Parser类Scnner类就是
           公共接口的一部分。
  私有化子系统类确实是有用,但是很少面向对象的编程员语言支持这一点。C++
  和Smaltalk语言仅在传统意义下为类提供了一个全局名空间。然而,最近C++标
           准委员会在C++语言中增加了一些名字空间[Str94],这些名字空间使得你可以仅

  暴露公共子系统类。