将“抽象化Abstraction”与“实现化Implementation”解耦。抽象的本意是将强耦合(继承)转换为弱耦合(聚合)。这里的抽象与实现不是一般程序设计下的抽象与实现
- 抽象:主要指高层的控制层,定义了基于“实现”的操作,如“遥控器”操作“电视机”。但是遥控器只负责发射指令,不关心指令的具体实现。
- 实现:抽象行为的具体执行者,比如“电视机”接受“遥控器”发出的关机指令。电视机接收指令,并负责关闭自己。
如此一来,抽象与实现就可以解耦,分别维护。
个人感觉最直观的还是类多维度解耦最直观:比如设备有电视、收音机;遥控器有基本遥控器、高级遥控器。如果用vanilla OOP的角度,需要设计4个类:电视基本遥控器、电视高级遥控器……但是使用桥接模式可以把实现(机器)绑定(聚合)给抽象(遥控器)。机器、遥控器实现相同的接口即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| class RemoteControl { protected: Device device_; public: RemoteControl(Device& device): device_(device) {} void togglePower() { if (device_.isEnabled()) device_.disable(); else device_.enable(); } void volumeDown() { device_.setVolume(device_.getVolume() - 10); } void volumeUp() { device_.setVolume(device_.getVolume() + 10); } void channelDown() { device_.setChannel(device_.getChannel() - 1); } void channelUp() { device_.setChannel(device_.getChannel() + 1); } }
class AdvancedRemoteControl: public RemoteControl { public: void mute() { device_.setVolume(0); } }
class Device { private: bool enabled_; int volume_; int channel_; public: virtual bool isEnabled() const = 0; virtual void enable() = 0; virtual void disable() = 0; virtual int getVolume() const = 0; virtual void setVolume(int percent) = 0; virtual int getChannel() const = 0; virtual void setChannel(int channel) = 0; }
class TV: public Device { }
class Radio: public Device { }
int main(int argc, char* argv[]) { TV* tv = new TV(); Remote* remote = new RemoteControl(*tv); remote.togglePower();
Radio* radio = new Radio(); AdvancedRemote* advancedRemote = new AdvancedRemoteControl(*radio);
delete tv; delete remote; delete radio; delete advancedRemote; }
|