cpp/c++ 设计模式之桥接模式
桥接模式是一种 c++ 设计模式,它分离了业务逻辑的抽象和实现,并桥接它们。抽象和实现两个部分可以分别独立的变化和更新,而不需要改变另一个部分。
c++ 桥接模式代码比较简单,定义两套类,一套类的基以另一套类的基为成员,各自的继承类并不需要关心基类。
3月 - fayige.top
在游戏中,导弹是一种武器,我们可以把导弹叫做武器的实现,把武器叫做导弹的抽象,这只是一种比喻。
导弹也有很多种:巡航导弹、洲际导弹、蜂群导弹,... 。
武器也可以分类:制导武器、静态武器、... 。
missile : 导弹
cruise missile : 巡航导弹
swarm missile : 蜂群导弹
weapon : 武器
guided weapon : 制导武器
bridge pattern 桥接模式 c++ 代码
dp_bridge_pattern.cpp
文件名:dp_bridge_pattern.cpp
#include <iostream> namespace wp { // 导弹基 class missile { public: virtual ~missile() = default; virtual void seek() const = 0; }; // 巡航导弹 class cruise_missile: virtual public wp::missile { public: void seek() const override { std::cout << "巡航导弹正在索敌 ..." << std::endl; } }; // 蜂群导弹 class swarm_missile: virtual public wp::missile { public: void seek() const override { std::cout << "蜂群导弹正在索敌 ..." << std::endl; } }; // 武器 class weapon { protected: wp::missile & missile; public: virtual ~weapon() = default; public: weapon(wp::missile & missile__): missile{missile__} { } public: void attack() const { std::cout << "武器桥接到导弹了:"; missile.seek(); } }; // 制导武器 class guided_weapon: virtual public wp::weapon { public: guided_weapon(wp::missile & missile__): wp::weapon{missile__} { } void attack() const { std::cout << "制导武器桥接到导弹了:"; this->missile.seek(); } }; } // namespace wp int main() { auto m1 = wp::cruise_missile{}; auto m2 = wp::swarm_missile{}; auto w1 = wp::weapon{m1}; auto w2 = wp::weapon{m2}; auto w3 = wp::guided_weapon{m1}; auto w4 = wp::guided_weapon{m2}; std::cout << "==========" << "导弹即将发射 ...\n"; m1.seek(); m2.seek(); std::cout << "\n==========" << "武器即将发射 ...\n"; w1.attack(); w2.attack(); std::cout << "\n==========" << "武器即将发射 ...\n"; w3.attack(); w4.attack(); }
==========导弹即将发射 ... 巡航导弹正在索敌 ... 蜂群导弹正在索敌 ... ==========武器即将发射 ... 武器桥接到导弹了:巡航导弹正在索敌 ... 武器桥接到导弹了:蜂群导弹正在索敌 ... ==========武器即将发射 ... 制导武器桥接到导弹了:巡航导弹正在索敌 ... 制导武器桥接到导弹了:蜂群导弹正在索敌 ...
代码例子里用到了多态。
Copyright 2024 fayige.top
Distributed under the Boost Software License, Version 1.0.
(See accompanying
file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)