一、表面计划模式概念
表面模式 (Facade) 是一种布局型计划模式, 为子系统中的一组接口提供一个同等的界面,此模式界说了一个高层接口,这个接口使得这一子系统更加容易利用。
- 表面模式为复杂子系统提供了一个简单接口,并不为子系统添加新的功能和举动。
- 表面模式实现了子系统与客户之间的松耦合关系。
- 表面模式没有封装子系统的类,只是提供了简单的接口。 如果应用必要,它并不限制客户利用子系统类。因此可以再系统易用性与通用性之间选择。
- 表面模式注重的是简化接口,它更多的时候是从架构的层次去看整个系统,而并非单个类的层次。
- 如果你必要一个指向复杂子系统的直接接口, 且该接口的功能有限, 则可以利用表面模式。
- 如果必要将子系统组织为多层布局, 可以利用表面。
表面计划模式的布局:
- 表面 (Facade) 提供了一种访问特定子系统功能的便捷方式, 其相识如何重定向客户端请求, 知晓如何利用一切运动部件。
- 创建附加表面 (Additional Facade) 类可以避免多种不相干的功能污染单一表面, 使其变成又一个复杂布局。 客户端和其他表面都可利用附加表面。
- 复杂子系统 (Complex Subsystem) 由数十个不同对象构成。 如果要用这些对象完成有意义的工作, 你必须深入相识子系统的实现细节, 好比按照正确次序初始化对象和为其提供正确格式的数据。
子系统类不会意识到表面的存在, 它们在系统内运作而且相互之间可直接举行交互。
- 客户端 (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;
- }
复制代码 二、与其他模式的关系
- 表面模式 (opens new window)为现有对象界说了一个新接口, 适配器模式 (opens new window)则会试图运用已有的接口。 适配器通常只封装一个对象, 表面通常会作用于整个对象子系统上。
- 当只需对客户端代码隐蔽子系统创建对象的方式时, 你可以利用抽象工厂模式 (opens new window)来代替表面 (opens new window)。
- 享元模式 (opens new window)展示了如何天生大量的小型对象, 表面 (opens new window)则展示了如何用一个对象来代表整个子系统。
- 表面 (opens new window)和中介者模式 (opens new window)的职责类似: 它们都尝试在大量精密耦合的类中组织起互助。
- 表面为子系统中的所有对象界说了一个简单接口, 但是它不提供任何新功能。 子系统本身不会意识到表面的存在。 子系统中的对象可以直接举行交换。
- 中介者将系统中组件的沟通举动中心化。 各组件只知道中介者对象, 无法直接相互交换。
- 表面 (opens new window)类通常可以转换为单例模式 (opens new window)类, 由于在大部门情况下一个表面对象就富足了。
- 表面 (opens new window)与代理模式 (opens new window)的相似之处在于它们都缓存了一个复杂实体并自行对其举行初始化。 代理与其服务对象遵循同一接口, 使得本身和服务对象可以互换, 在这一点上它与表面不同。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |