C++设计模式10——外观(Facade)模式

C++设计模式10——外观(Facade)模式

  • 1. 外观(Facade)模式介绍
  • 2. 为了方便理解,举个例子
  • 3. 外观(Facade)模式优缺点

1. 外观(Facade)模式介绍

定义:是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。
关键代码:在客户端和复杂系统之间再加一层,这一层将调用顺序、依赖关系等处理好。
应用实例: 1、去医院看病,可能要去挂号、门诊、划价、取药,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便。2、打开家里各种智能设备的模式
类图
C++设计模式10——外观(Facade)模式_第1张图片

2. 为了方便理解,举个例子

#include 
#include 
using namespace std;
//符合迪米特法则:一个类尽量少了解其他类
//电视机
class Television {
  public:
    void On() {
        cout << "电视机打开" << endl;
    }
    void Off() {
        cout << "电视机关闭" << endl;
    }
};

//灯
class Light {
  public:
    void On() {
        cout << "灯打开" << endl;
    }
    void Off() {
        cout << "灯关闭" << endl;
    }
};

//音响
class Audio {
  public:
    void On() {
        cout << "音响打开" << endl;
    }
    void Off() {
        cout << "音响关闭" << endl;
    }
};

//麦克风
class Mircophone {
  public:
    void On() {
        cout << "麦克风打开" << endl;
    }
    void Off() {
        cout << "麦克风关闭" << endl;
    }
};

//DVD播放器
class DVDPlayer {
  public:
    void On() {
        cout << "DVD播放器打开" << endl;
    }
    void Off() {
        cout << "DVD播放器关闭" << endl;
    }
};

//游戏机
class GameMachine {
  public:
    void On() {
        cout << "游戏机打开" << endl;
    }
    void Off() {
        cout << "游戏机关闭" << endl;
    }
};

//KTV模式
class KTVMode {
  public:
    KTVMode() {
        pTv = new Television;
        pLight = new Light;
        pAudio = new Audio;
        pMicrophone = new Mircophone;
        pDvd = new DVDPlayer;
    }
    void OnKtv() {
        pTv->On();
        pLight->Off();
        pAudio->On();
        pMicrophone->On();
        pDvd->On();
    }
    void OffKtv() {
        pTv->Off();
        pLight->On();
        pAudio->Off();
        pMicrophone->Off();
        pDvd->Off();
    }
    ~KTVMode() {
        delete pTv;
        delete pLight;
        delete pAudio;
        delete pMicrophone;
        delete pDvd;
    }

    Television* pTv;
    Light* pLight;
    Audio* pAudio;
    Mircophone* pMicrophone;
    DVDPlayer* pDvd;
};

void test01() {
    KTVMode* ktv = new KTVMode;
    ktv->OnKtv();
}

int main() {
    test01();
    return 0;
}

3. 外观(Facade)模式优缺点

外观(Facade)模式是“迪米特法则”的典型应用,它有以下主要优点

  1. 降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类。

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

  3. 降低了大型软件系统中的编译依赖性,简化了系统在不同平台之间的移植过程,因为编译一个子系统不会影响其他的子系统,也不会影响外观对象。

外观(Facade)模式的主要缺点如下。

  1. 不能很好地限制客户使用子系统类。

  2. 增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。

你可能感兴趣的:(设计模式,外观模式)