c++设计模式概述之外观
2024-09-01 04:10:42
类写的不够规范,目的是缩短篇幅,请实际中不要这样做。
1、概述
了解外观模式相关概念后,一下子想到的是主板, 主板上有各种元器件,各种指示灯,各种电容,各种电路。然而,主板供电的接口就一个,其他元器件需要用电的都是从这里获取电源。比如,风扇,LED灯。要是我们单独出来,把每一个元器件单独通电,那主板上得有多少个接口啊, 主板直接通电接口就一个,省却很多麻烦。
现实中, 可能会遇到类似上面的情况,需要 一个接口调用 多个子系统的接口。
下面开始范例, 以主板为例,电扇和LED灯组为子系统, 主板上存在一个假想的开关,控制子系统的电源通断(on off 函数)。
2、元器件类,
元器件可以通断电
// 电器 具有通电和断电的功能
class equipment
{
public:
virtual void on() = 0;
virtual void off() = 0;
};
3、LED灯类
// 电灯
class ep_bulb : public equipment
{
public:
void on()
{
cout << "\n电灯打开了\n";
} void off()
{
cout << "\n 电灯关闭了 \n";
}
};
4、风扇
// 风扇
class ep_fan : public equipment
{
public:
void on()
{
cout << "\n风扇打开了\n";
} void off()
{
cout << "\n 风扇关闭了 \n";
}
};
5、主板上的一个电源控制开关
// 电源开关集合接口
class power_switch : public equipment
{
public: // 电源开关中添加下面两组电器
power_switch()
{
equipment *pinstance = nullptr; // 添加电灯
pinstance = new ep_bulb;
if (!pinstance)
cout << "电灯创建失败";
else
_plist_ep.push_back(pinstance); pinstance = nullptr;
pinstance = new ep_fan; if (!pinstance)
cout << "电扇创建失败";
else
_plist_ep.push_back(pinstance);
} virtual ~power_switch()
{
for each(auto index in _plist_ep)
{
if (index)
{
delete index;
index = nullptr;
}
}
} // -------------------------------------------------------------------------------
// 对外提供的统一接口
// ------------------------------------------------------------------------------- // 通电
void on()
{
for each(auto index in _plist_ep)
index->on();
} // 断电
void off()
{
for each(auto index in _plist_ep)
index->off();
} private:
list<equipment* > _plist_ep;
};
6、调用示例
void call_facade()
{
std::unique_ptr<equipment> ppower_switch(new(std::nothrow) power_switch);
if (!ppower_switch)
{
cout << "\n 电源开关创建失败 \n";
return;
} //
cout << "主板通电结果:";
ppower_switch->on(); cout << "\n\n\n\n主板断电结果:";
ppower_switch->off();
}
7、输出结果:
最新文章
- 【代码笔记】iOS-用户发布后能保存崩溃
- 读深入了解c++内核对象模型小结(1/3/4)
- android oncreate获取宽高度
- IOS-App installation failed原因及解决方法
- iOS关于UILabel 基本属性 背景图片 背景色
- codeforces 425D
- linux 系统性能指标采样脚本
- Three.js基础探寻十——动画
- Android控件之Button(按钮控件)和ImageButton(图片按钮控件)
- php操作mysqli(示例代码)
- 解决kernel headers报错
- Xcode 快捷键-b
- 如何获得 oracle RAC 11g asm spfile S档
- java实现网页爬虫
- Dynamics CRM2015 on-premises直接升级Dynamics CRM2016 on-premises
- Orientation Auto Rotation旋转屏幕crash问题(Unity3D开发之十四)
- 【转】百度站长平台MIP引入工具使用心得
- .NET Core微服务之基于Ocelot+Butterfly实现分布式追踪
- WebLogic使用总结
- struts2整合uploadify插件怎样传参数