外观模式(Facade)
意图:
为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,
这个接口使得这一子系统更加容易使用。
适用性:
1)当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而
变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统
更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系
统的用户带来一些使用上的困难。
外观模式可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足
够,而那些需要更多的可定制性的用户可以越过外观模式层。
2)客户程序与抽象类的实现部分之间存在着很大的依赖性。引入外观模式将这
个子系统与客户以及其他的子系统分离,可以提供子系统的独立性和可一移
植性。
3)当你需要构建一个层次结构的子系统时,使用外观模式定义子系统中每层的
入口点。如果子系统之间是相互依赖的,你可以让它们仅通过外观模式进行
通讯,从而简化它们之间的依赖关系.
效果:
1)它对客户屏蔽了系统组件,因而减少了客户处理对象的数目并使得子系统使
用起来更加方便。
2)它实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是
紧耦合的。松耦合关系使得子系统的组件变化不会影响到它的客户。外观模
式有助于建立层次结构系统,也有助于对对象之间的依赖关系分层。外观模
式可以消除复杂的循环依赖关系。这一点在客户程序与子系统是分别实现的
时候尤为重要。
在大型软件系统中降低编译依赖性至关重要。在子系统改变时,希望尽量减
少重编译工作以节省时间。用外观模式可以降低编译性,限制重要系统较小
的变化所需要的重编译工作。外观模式同样也有利于简化系统在不同平台之
间的移植过程,因为编译一个子系统一般不需要编译所有其他的子系统。
3)如果应用需要,它并不限制它们使用子系统类。因此你可以在系统易用性和
通用性之间加以选择。
实现:
使用外观模式时需要注意以下几点:
1)降低客户 - 子系统之间的耦合度 用抽象类实现外观模式而它的具体类对应
不同的子系统实现,这可以进一步降低客户与子系统的耦合度。这样,客户
就可以通过抽象的外观模式类接口与子系统通讯。这种抽象耦合关系使得客户
不知道它使用的是子系统的哪一个实现。
除生成子类的方法以外,另一种方法是用不同的子系统对象配置外观模式对象。
为定制外观模式,仅需要对它的子系统对象(一个或多个)进行替换即可。
2)公共子系统类与私有子系统类 一个子系统与一个类的相似之处是,他们都
有接口并且它们都封装了一些东西---类封装了状态和操作,而系统封装了一
些类。考虑一个类的公共和私有接口是有益的,我们也可以考虑子系统的公共
和私有接口。
子系统的公共接口包含所有客户程序可以访问的类;私有接口仅用于对子系统
进行扩充。当然,外观模式是公共接口的一部分,但它不是唯一的部分,子系
统的其他部分通常也是公共的。例如,编译子系统中的Parser类Scnner类就是
公共接口的一部分。
私有化子系统类确实是有用,但是很少面向对象的编程员语言支持这一点。C++
和Smaltalk语言仅在传统意义下为类提供了一个全局名空间。然而,最近C++标
准委员会在C++语言中增加了一些名字空间[Str94],这些名字空间使得你可以仅
意图:
为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,
这个接口使得这一子系统更加容易使用。
适用性:
1)当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而
变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统
更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系
统的用户带来一些使用上的困难。
外观模式可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足
够,而那些需要更多的可定制性的用户可以越过外观模式层。
2)客户程序与抽象类的实现部分之间存在着很大的依赖性。引入外观模式将这
个子系统与客户以及其他的子系统分离,可以提供子系统的独立性和可一移
植性。
3)当你需要构建一个层次结构的子系统时,使用外观模式定义子系统中每层的
入口点。如果子系统之间是相互依赖的,你可以让它们仅通过外观模式进行
通讯,从而简化它们之间的依赖关系.
效果:
1)它对客户屏蔽了系统组件,因而减少了客户处理对象的数目并使得子系统使
用起来更加方便。
2)它实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是
紧耦合的。松耦合关系使得子系统的组件变化不会影响到它的客户。外观模
式有助于建立层次结构系统,也有助于对对象之间的依赖关系分层。外观模
式可以消除复杂的循环依赖关系。这一点在客户程序与子系统是分别实现的
时候尤为重要。
在大型软件系统中降低编译依赖性至关重要。在子系统改变时,希望尽量减
少重编译工作以节省时间。用外观模式可以降低编译性,限制重要系统较小
的变化所需要的重编译工作。外观模式同样也有利于简化系统在不同平台之
间的移植过程,因为编译一个子系统一般不需要编译所有其他的子系统。
3)如果应用需要,它并不限制它们使用子系统类。因此你可以在系统易用性和
通用性之间加以选择。
实现:
使用外观模式时需要注意以下几点:
1)降低客户 - 子系统之间的耦合度 用抽象类实现外观模式而它的具体类对应
不同的子系统实现,这可以进一步降低客户与子系统的耦合度。这样,客户
就可以通过抽象的外观模式类接口与子系统通讯。这种抽象耦合关系使得客户
不知道它使用的是子系统的哪一个实现。
除生成子类的方法以外,另一种方法是用不同的子系统对象配置外观模式对象。
为定制外观模式,仅需要对它的子系统对象(一个或多个)进行替换即可。
2)公共子系统类与私有子系统类 一个子系统与一个类的相似之处是,他们都
有接口并且它们都封装了一些东西---类封装了状态和操作,而系统封装了一
些类。考虑一个类的公共和私有接口是有益的,我们也可以考虑子系统的公共
和私有接口。
子系统的公共接口包含所有客户程序可以访问的类;私有接口仅用于对子系统
进行扩充。当然,外观模式是公共接口的一部分,但它不是唯一的部分,子系
统的其他部分通常也是公共的。例如,编译子系统中的Parser类Scnner类就是
公共接口的一部分。
私有化子系统类确实是有用,但是很少面向对象的编程员语言支持这一点。C++
和Smaltalk语言仅在传统意义下为类提供了一个全局名空间。然而,最近C++标
准委员会在C++语言中增加了一些名字空间[Str94],这些名字空间使得你可以仅
暴露公共子系统类。