2022-08-05 外观模式

一.优点

1.端屏蔽了⼦系统组件,减少了客户所需处理的对象数⽬,并
使得⼦系统使⽤起来更加容易。
2.它实现了⼦系统与客户端之间的松耦合关系,这使得⼦系统的变化不会
影响到调⽤它的客户端,只需要调整外观类即可。
3.⼀个⼦系统的修改对其他⼦系统没有任何影响。

二.缺点

1.设计不当,增加新的⼦系统可能需要修改外观类的源代码,违背了
开闭原则。

三.应用场景

1.复杂系统需要简单⼊⼝使⽤。
2.客户端程序与多个⼦系统之间存在很⼤的依赖性。
3.在层次化结构中,可以使⽤外观模式定义系统中每⼀层的⼊⼝,层与
层之间不直接产⽣联系,⽽通过外观类建⽴联系,降低层之间的耦合度。

ps:这不就是把功能类组合起来吗

//appearance.hpp
#pragma once
#include 
class DVDPlay
{
public:
    void On()
    {
        std::cout << "打开了DVD" << std::endl;
    }
    void Off()
    {
        std::cout << "关闭了DVD" << std::endl;
    }
};

class VoiceBox
{
public:
    void On()
    {
        std::cout << "打开了音箱" << std::endl;
    }
    void Off()
    {
        std::cout << "关闭了音响" << std::endl;
    }
};

class XBox
{
public:
    void On()
    {
        std::cout << "打开了xbox游戏机" << std::endl;
    }
    void Off()
    {
        std::cout << "关闭了xbox游戏机" << std::endl;
    }
};
class TV
{
public:
    void On()
    {
        std::cout << "打开TV" << std::endl;
    }
    void Off()
    {
        std::cout << "关闭TV" << std::endl;
    }
};

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

class Light
{
public:
    void On()
    {
        std::cout << "打开灯" << std::endl;
    }
    void Off()
    {
        std::cout << "关闭灯" << std::endl;
    }
};
//外观类
class HomePlayFacade
{
public:
    //看电影
    void SeeMovic()
    {
        std::cout << "进入看电影模式" << std::endl;
        light.Off();
        tv.On();
        vioce_box.On();
    }
    void DoKtv()
    {
        std::cout << "智慧家庭进入KTV模式" << std::endl;
        tv.On();
        vioce_box.On();
        dvd.On();
        micro_phone.On();
    }
    //打游戏
    void PlayGame()
    {
        std::cout << "智慧家庭进⼊ 游戏模式" << std::endl;
        tv.On();
        vioce_box.On();
        xbox.On();
    }
    //休息
    void Rest()
    {
        std::cout << "智慧家庭 休息模式" << std::endl;
        light.Off();
        tv.Off();
        vioce_box.Off();
        dvd.Off();
        micro_phone.Off();
        xbox.Off();
    }
private:
    Light light;
    Microphone micro_phone;
    TV tv;
    XBox xbox;
    VoiceBox vioce_box;
    DVDPlay dvd;
};
//main.cpp
#include "appearance.h"
#include 
int main()
{
    HomePlayFacade facade;
    facade.DoKtv();
    facade.PlayGame();
    facade.SeeMovic();
    facade.Rest();
    return 0;
}

你可能感兴趣的:(2022-08-05 外观模式)