设计模式之外观模式

2014-11-23 23:31:09 · 作者: · 浏览: 0

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

不用外观模式时客户程序与子系统都发生了耦合,这种耦合使得客户类依赖于子系统,系统在维护和修改时都缺乏灵活性,因为当子系统变化时,客户类也将面临很多变化的挑战。一个合情合理的设计就是为这些子系统创建一个统一的接口,这个接口简化客户类的判断操作。这样一来,增加新的子系统或者移除子系统都非常方便,客户类无须进行修改(或者极少的修改),只需要在外观类中增加或移除对子系统的引用即可。

这里所指的子系统是一个广义的概念,它可以是一个类、一个功能模块、系统的一个组成部分或者一个完整的系统。

要点:

外观模式通过引入一个外观角色来简化客户端与子系统之间的交互,为复杂的子系统调用提供一个统一的入口,降低子系统与客户端的耦合度,且客户端调用非常方便。

例:一个电源开关可以控制一盏灯、一个风扇、一台空调或一台电视机的启动和关闭,而一个电源总开关可以同时控制上述所有电器设备,这里的电源总开关即为该系统的外观模式设计。
外观类:含有四个电器的实例。

\

class Facade
{
private:
    Light light;
    Fan fan;
    Aircondition aircondition;
    TV tv;
public:
    void Switch()
    {
        light.Switch();
        fan.Switch();
        airconditioning.Switch();
        tv.Switch();
    }
};
客户端调用只需知道外观类接行,不必知道内部复杂的细节。
int main()
{
    Facade Switch;
    Switch.Switch();
    return 0;
}
下面是4个电器类。
class Light
{
public:
    void Switch()
    {
        cout<<"Light open"<
  
   
class Fan
{
public:
    void Switch()
    {
        cout<<"Fan open"<
    
     
class Aircondition
{
public:
    void Switch()
    {
        cout<<"Air condition open"<
      
       
class TV
{
public:
    void Switch()
    {
        cout<<"TV open"<
        
         外观模式包含两个角色:
         
(1) Facade(外观角色):在客户端可以调用它的方法,在外观角色中可以知道相关的(一个或者多个)子系统的功能和责任;在正常情况下,它将所有从客户端发来的请求委派到相应的子系统去,传递给相应的子系统对象处理。
(2) SubSystem(子系统角色):在软件系统中可以有一个或者多个子系统角色,每一个子系统可以不是一个单独的类,而是一个类的集合,它实现子系统的功能;每一个子系统都可以被客户端直接调用,或者被外观角色调用,它处理由外观类传过来的请求;子系统并不知道外观的存在,对于子系统而言,外观角色仅仅是另外一个客户端而已。