设计模式之外观设计模式

一、外观设计模式概念

外观模式 (Facade) 是一种结构型设计模式, 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

  • 外观模式为复杂子系统提供了一个简单接口,并不为子系统添加新的功能和行为。
  • 外观模式实现了子系统与客户之间的松耦合关系。
  • 外观模式没有封装子系统的类,只是提供了简单的接口。 如果应用需要,它并不限制客户使用子系统类。因此可以再系统易用性与通用性之间选择。
  • 外观模式注重的是简化接口,它更多的时候是从架构的层次去看整个系统,而并非单个类的层次。
  • 如果你需要一个指向复杂子系统的直接接口, 且该接口的功能有限, 则可以使用外观模式。
  • 如果需要将子系统组织为多层结构, 可以使用外观。

外观设计模式的结构

  1. 外观 (Facade) 提供了一种访问特定子系统功能的便捷方式, 其了解如何重定向客户端请求, 知晓如何操作一切活动部件。

  2. 创建附加外观 (Additional Facade) 类可以避免多种不相关的功能污染单一外观, 使其变成又一个复杂结构。 客户端和其他外观都可使用附加外观。

  3. 复杂子系统 (Complex Subsystem) 由数十个不同对象构成。 如果要用这些对象完成有意义的工作, 你必须深入了解子系统的实现细节, 比如按照正确顺序初始化对象和为其提供正确格式的数据。

    子系统类不会意识到外观的存在, 它们在系统内运作并且相互之间可直接进行交互。

  4. 客户端 (Client) 使用外观代替对子系统对象的直接调用。

代码如下:

    问题:有一套复杂的视频系统,以及以太复杂的音频系统。希望简化使用流程,提供简化的操作面板。
    解决方案:为子系统中的一组接口提供一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

#include <iostream>
#include <string>
//子系统1
class VedioSystem {
public:
	std::string initial()const
	{
		return "视频系统:Ready!\n";
	}
	std::string play()const
	{
		return "视频系统:Go!\n";
	}
	std::string operationX()const
	{
		return "视频系统:不常用的操作!\n";
	}

};
//子系统2
class RadioSystem {
public:
	std::string init()const
	{
		return "音频系统:就绪!\n";
	}
	std::string play()const
	{
		return "音频系统:播放!\n";
	}
	std::string operationX()const
	{
		return "音频系统:不常用的操作!\n";
	}
	std::string mute()const
	{
        return "音频系统:静音!\n";
	}
};
//外观类
class Controller {
protected:
	VedioSystem* m_vedio;
    RadioSystem* m_radio;
public:
	Controller(VedioSystem* vedio = nullptr, RadioSystem* radio = nullptr)
	{
		if (!vedio)
		{
			m_vedio = vedio;
		}
		else
		{
			new VedioSystem();
			m_radio = radio ? radio : new RadioSystem();
		}
	}
	~Controller()
	{
        delete m_vedio;
	}
	std::string start()const
	{
		std::string string = "控制器启动视频系统\n";
        string += m_vedio->initial();
        string += m_radio->init();
		string += "控制器启动播放\n";
		string += m_vedio->play();
		string += m_radio->play();
        return string;
	}
	std::string mute()const
	{
		return "控制器静音\n" + m_radio->mute();
	}
};
int main()
{
	VedioSystem* vedio = new VedioSystem();
    RadioSystem* radio = new RadioSystem();
    Controller controller(vedio, radio);
	std::cout << controller.start() << std::endl;


    return 0;
}

 二、与其他模式的关系

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值