/*
* 练习1、设计一个开关
*
* 这个开关可以对用电设备进行开关控制,但它不知道要控制的用电设备具体是什么。
*
* 实现思路:先定义一个具有开关功能的抽象类,然后写两个纯虚函数 on(),off()接口。
* 再定义一个具体的开关类,然后定义一个开关抽象类的引用,用来获取具体的设备,控制其打开和关闭
* 然后定义一个开关抽象类的派生类(用来实现具体的拥有开关属性的用电设备)
* 最后将派生来传递给具体的开关类,从而达到具体的开关类 和 具体的用电设备 互不关联的原则,开关类只负责开关
* 不需要知道它具体控制的是什么设备。
*
* 最终达到松耦合的效果
*
* 2023.2.15
*/
//定义具有开关特性的抽象类接口 Switchable
#include <iostream>
class Switchable {
public:
virtual void on() const = 0;
virtual void off() const = 0;
};
//定义具体的开关类 Switch
class Switch {
private:
bool state{ false };
private:
Switchable& m_switchable;
public:
Switch() = delete;
explicit Switch(Switchable& switchable):m_switchable(switchable){}
public:
void toggle() {
if (state)
{
state = false;
m_switchable.on();
}
else {
state = true;
m_switchable.off();
}
}
};
//通过抽象开关接口,派生一个灯类 Lamp
class Lamp:public Switchable {
private:
std::string m_name;
public:
Lamp() = delete;
explicit Lamp(std::string name):m_name(name){}
public:
virtual void on() const override{
std::cout << m_name << ":打开" << std::endl;
}
virtual void off()const override {
std::cout << m_name << ":关闭" << std::endl;
}
};
int main() {
Lamp lamp("台灯");
Switch witch(lamp);
witch.toggle();
witch.toggle();
return 0;
}