前言
桥接和享元模式(结构型设计模式)的 C++ 代码示例模板。
代码仓库
桥接模式(Bridge)
结构
- 抽象实现类
- 具体实现类
- 抽象抽象类
- 具体抽象类
- 桥接过程1:抽象抽象类 封装(保护权限) 抽象实现指针(实际上指向一个具体实现对象)
- 桥接过程2:形式上调用 抽象的方法;实际上调用 抽象的内容 + 实现的方法
重点理解
- 多维结构
- 合成聚合原则(C/ARP),聚合/组合关系
- 拆分抽象内容和实现内容,使用聚合/组合关系桥接
- 抽象内容:不是指抽象类和接口,指一个独立维度/类层次,如手机品牌类
- 实现内容:不是指具体类和实现类,指一个独立维度/类层次,如手机软件类
- 聚合/组合关系:手机品牌对象 封装 相关的手机软件对象
- 桥接方式:手机品牌对象 通过 手机软件对象 使用手机软件类的属性和方法,不必知道手机软件类的状态和行为
- 无桥接方式(使用继承关系):每个手机品牌类 继承 相关的手机软件类,类的数量呈树状结构几何递增,难以维护
代码
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 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
| #include <iostream>
using std::cout; using std::endl;
class AbstractImplementation { public: virtual void impl_func() = 0; };
class ConcreteImplementationA : public AbstractImplementation { public: void impl_func() override { cout << "ConcreteImplementationA" << endl;
return; } };
class ConcreteImplementationB : public AbstractImplementation { public: void impl_func() override { cout << "ConcreteImplementationB" << endl;
return; } };
class AbstractAbstraction { public: AbstractAbstraction(AbstractImplementation *abst_impl) : abst_impl(abst_impl) {} ~AbstractAbstraction() { delete this->abst_impl; }
virtual void abst_func() = 0;
protected: AbstractImplementation *abst_impl; };
class ConcreteAbstractionA : public AbstractAbstraction { public: ConcreteAbstractionA(AbstractImplementation *abst_impl) : AbstractAbstraction(abst_impl) {}
void abst_func() override { cout << "ConcreteAbstractionA" << endl; this->abst_impl->impl_func();
return; } };
class ConcreteAbstractionB : public AbstractAbstraction { public: ConcreteAbstractionB(AbstractImplementation *abst_impl) : AbstractAbstraction(abst_impl) {}
void abst_func() override { cout << "ConcreteAbstractionB" << endl; this->abst_impl->impl_func();
return; } };
int main() { AbstractImplementation *abst_impl_A = new ConcreteImplementationA(); AbstractAbstraction *abst_abst_A = new ConcreteAbstractionA(abst_impl_A); abst_abst_A->abst_func(); delete abst_abst_A;
AbstractImplementation *abst_impl_B = new ConcreteImplementationB(); AbstractAbstraction *abst_abst_B = new ConcreteAbstractionB(abst_impl_B); abst_abst_B->abst_func(); delete abst_abst_B;
return 0; }
|
享元模式(Flyweight)
享元 即 共享
结构
- 抽象享元类
- 具体享元类(需要共享的内容)
- 具体不共享类(不需要共享的内容)
- 享元工厂类
- 内部状态(需要共享的内容):对象的不变状态,可以被多个对象共享,不取决于外部环境,通常存储在具体享元对象内部
- 外部状态(不需要共享的内容):对象的可变状态,不可以被多个对象共享,取决于外部环境,需要时作为参数传递给具体享元/具体不共享对象
- 具体享元类 有内部状态,可以有外部状态
- 具体不共享类 没有内部状态,有外部状态
- 享元工厂 封装 享元集合(实际上 封装 具体享元对象)(具体享元对象是共享的,具有共性,可以用工厂/集合统一管理;具体不共享对象是不共享的,不具有共性,一般不统一管理,需要时再创建)
- 享元工厂 获取抽象享元指针(实际上指向一个具体享元对象)
- 享元工厂 获取抽象享元指针(实际上指向一个具体不共享对象)
重点理解
- 具体不共享类 和 外部状态(不需要共享的内容)
- 具体享元类 和 内部状态(需要共享的内容)
- 具体享元对象和内部状态是共享的,从享元工厂创建或获取(无时创建,有时获取)
- 具体不共享对象和外部状态是不共享的,从享元工厂创建(需要时创建)
代码
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 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
| #include <iostream> #include <unordered_map>
using std::cout; using std::endl; using std::pair; using std::unordered_map;
class AbstractFlyweight { public: virtual void func(int external_state) = 0; };
class ConcreteFlyweight : public AbstractFlyweight { public: ConcreteFlyweight(int internal_state) : internal_state(internal_state) {}
void func(int external_state) override { cout << "external_state: " << external_state << endl; cout << "internal_state: " << this->internal_state << endl; }
private: int internal_state; };
class ConcreteUnshared : public AbstractFlyweight { public: void func(int external_state) override { cout << "external_state: " << external_state << endl; } };
class FlyweightFactory { public: ~FlyweightFactory() { for (pair<int, AbstractFlyweight *> p : this->flyweight_unmap) { delete p.second; } }
AbstractFlyweight * get_concrete_flyweight(int key) { if (this->flyweight_unmap.find(key) == this->flyweight_unmap.end()) { this->flyweight_unmap[key] = new ConcreteFlyweight(key); }
return this->flyweight_unmap[key]; }
AbstractFlyweight *get_concrete_unshared() { return new ConcreteUnshared(); }
private: unordered_map<int, AbstractFlyweight *> flyweight_unmap; };
int main() { FlyweightFactory flyweight_factory;
AbstractFlyweight *concrete_flyweight_1 = flyweight_factory.get_concrete_flyweight(10); concrete_flyweight_1->func(100);
AbstractFlyweight *concrete_flyweight_2 = flyweight_factory.get_concrete_flyweight(10); concrete_flyweight_2->func(200);
AbstractFlyweight *concrete_unshared = flyweight_factory.get_concrete_unshared(); concrete_unshared->func(300);
delete concrete_unshared;
return 0; }
|
总结
桥接和享元模式(结构型设计模式)的 C++ 代码示例模板。
参考资料
作者的话
- 感谢参考资料的作者/博主
- 作者:夜悊
- 版权所有,转载请注明出处,谢谢~
- 如果文章对你有帮助,请点个赞或加个粉丝吧,你的支持就是作者的动力~
- 文章在描述时有疑惑的地方,请留言,定会一一耐心讨论、解答
- 文章在认识上有错误的地方, 敬请批评指正
- 望读者们都能有所收获