设计模式(八)——外观模式

根据迪米特法则,如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。
Facade模式也叫外观模式,是由GoF提出的23种设计模式中的一种。
Facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一
致的简单的界面。这个一致的简单的界面被称作facade。

 

Façade(外观角色):为调用方, 定义简单的调用接口。
SubSystem(子系统角色):功能提供者。指提供功能的类群(模块或子系
统)。

 

外观模式就是将复杂的⼦类系统抽象到同⼀个的接⼝进⾏管理
,外界只需要通过此接⼝与⼦类系统进⾏交互,⽽不必要直接与复杂的⼦类
系统进⾏交互

 

#include <iostream>

using namespace std;

class TV
{
public:
    virtual void turn_on()
    {
        cout << "电视打开" << endl;
    }
    virtual void turn_off()
    {
        cout << "电视关闭" << endl;
    }
};

class LED
{
public:
    virtual void turn_on()
    {
        cout << "电灯打开" << endl;
    }
    virtual void turn_off()
    {
        cout << "电灯关闭" << endl;
    }
};

class MusicPlayer
{
public:
    virtual void turn_on()
    {
        cout << "音箱打开" << endl;
    }
    virtual void turn_off()
    {
        cout << "音箱关闭" << endl;
    }
};

class Gamer
{
public:
    virtual void turn_on()
    {
        cout << "游戏机打开" << endl;
    }
    virtual void turn_off()
    {
        cout << "游戏机关闭" << endl;
    }
};

class Miker
{
public:
    virtual void turn_on()
    {
        cout << "麦克风打开" << endl;
    }
    virtual void turn_off()
    {
        cout << "麦克风关闭" << endl;
    }
};

class DVDPlayer
{
public:
    virtual void turn_on()
    {
        cout << "DVD打开" << endl;
    }
    virtual void turn_off()
    {
        cout << "DVD关闭" << endl;
    }
};

class Client
{
public:
    void KTV()
    {
        cout << "KTV模式" << endl;
        tv.turn_on();
        led.turn_off();
        music_player.turn_on();
        miker.turn_on();
        dvd.turn_on();
    }
    void Game()
    {
        cout << "游戏模式" << endl;
        tv.turn_on();
        music_player.turn_on();
        gamer.turn_on();
    }

private:
    TV tv;
    DVDPlayer dvd;
    Miker miker;
    LED led;
    Gamer gamer;
    MusicPlayer music_player;
};

int main()
{
    Client client;
    client.KTV();
    cout << "------------------------" << endl;
    client.Game();

    system("pause");
    return 0;
}

 

posted @ 2019-02-11 23:18  狂奔~  阅读(224)  评论(0编辑  收藏  举报