Недавно я предпринял несколько попыток понять паттерн моста. Различные веб-сайты пытаются объяснить эту концепцию по-разному, но я начинаю понимать, что этот шаблон — разделение абстракции и реализации — позволяет нам создавать различные виды реализации, и, кроме того, мы можем расширять наш интерфейс. Но я просто хочу убедиться в одном - на примере ниже:
#include <iostream>
class Device
{
protected:
int volume_m{ 0 };
public:
int getVolume()
{
return volume_m;
}
void setVolume(int value)
{
volume_m = value;
}
};
class RemoteController
{
private:
std::shared_ptr<Device> device_m;
public:
RemoteController(std::shared_ptr<Device> device) : device_m(device) {}
void volumeUp()
{
device_m->setVolume(device_m->getVolume()+10);
std::cout << "Volume turned up. Current volume: " << device_m->getVolume() << '\n';
}
void volumeDown()
{
this->device_m->setVolume(this->device_m->getVolume() - 10);
std::cout << "Volume turned down. Current volume: " << device_m->getVolume() << '\n';
}
};
class TV : public Device
{
};
class Radio : public Device
{
};
int main()
{
std::shared_ptr<Device> tv = std::make_shared<TV>();
std::shared_ptr<RemoteController> controller = std::make_shared<RemoteController>(tv);
controller->volumeUp();
controller->volumeUp();
controller->volumeUp();
}
Что, если я хочу сделать разные сообщения для TV
и Radio
? Должен ли я создавать в Device
виртуальные методы с именами volumeUp()
и volumeDown()
, которые будут унаследованы Radio
и TV
? И RemoteController
будет вызывать только эти виртуальные методы?