首页 > 代码库 > Facade——外观模式

Facade——外观模式

  Facade外观模式,也是比较常用的一种模式,基本上所有软件系统中都会用到。 GOF 在《设计模式》一书中给出如下定义:为子系统中的一组接口提供一个一致的界面, Facade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。简单说,就是将复杂的逻辑封装起来,对外公开简单的接口,由客户程序调用。客户对象通过一个外观接口读写子系统中各接口的数据资源。

 

适用情景

(1)设计初期阶段,应该有意识的将不同层分离,层与层之间建立外观模式。

 

(2)开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调用接口。

 

(3)维护一个大型遗留系统的时候,可能这个系统已经非常难以维护和扩展,但又包含非常重要的功能,为其开发一个外观类,以便新系统与其交互。

 

优点:

(1)降低了子系统与客户端之间的耦合关系。

 

(2)客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易。

 

外观模式类图:

技术分享

下面我们来实现一个外观模式案例:

根据类图实现家庭影院外观模式应用;

(1).实现KTV模式:电视on,灯off,音响on,DVD off。

(2).实现游戏模式:电视on,音响on,游戏机on。

类图:

技术分享

 

实现代码:

#include<iostream>
using namespace std;

class TV 
{
public:
    void on() { cout << "TV打开" << endl; }
    void off() { cout << "TV关闭" << endl; }
};

class XBox
{
public:
    void on() { cout << "XBox打开" << endl; }
    void off() { cout << "XBox关闭" << endl; }
};

class Light
{
public:
    void on() { cout << "Light打开" << endl; }
    void off() { cout << "Light关闭" << endl; }
};

class DVD
{
public:
    void on() { cout << "DVD打开" << endl; }
    void off() { cout << "DVD关闭" << endl; }
};

class MikePhone
{
public:
    void on() { cout << "MikePhone打开" << endl; }
    void off() { cout << "MikePhone关闭" << endl; }
};

class HomePlayer
{
public:
    void KTVMode()
    {
        tv.on();
        light.off();
        mike.on();
        dvd.on();
    }
    void GameMode()
    {
        tv.on();
        mike.on();
        xbox.on();
    }
private:
    TV tv;
    DVD dvd;
    MikePhone mike;
    Light light;
    XBox xbox;    
};

int main(void)
{
    HomePlayer hp;
    cout << "进入KTV模式" << endl;
    hp.KTVMode();
    cout << "进入Game模式" << endl;
    hp.GameMode();
    return 0;
}

运行结果:

技术分享

 

Facade——外观模式