前言
代理和适配器模式(结构型设计模式)的 C++ 代码示例模板。
代码仓库
代理模式(Proxy)
结构
- 抽象服务类
- 具体服务类(被代理者)
- 代理类(代理者)
- 代理类 继承(多态) 抽象服务类,和具体服务类有相同的对外方法/接口
- 代理类 封装/隐藏 具体服务对象,调用代理对象的方法 func(),实际上是 func() 内部调用具体服务对象的方法
核心
- 封装
- 继承
- 多态
- 使用代理对象,实际上是使用具体服务对象
代码
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
| #include <iostream>
using std::cout; using std::endl;
class AbstractService { public: virtual void func() const = 0; };
class ConcreteService : public AbstractService { public: void func() const override { cout << "func()" << endl;
return; } };
class Proxy : public AbstractService {
public: Proxy() : concrete_service(){};
void func() const override { this->concrete_service.func();
return; }
private: ConcreteService concrete_service; };
int main() { Proxy proxy;
proxy.func();
return 0; }
|
适配器模式(Adapter)
类型
- 类适配器模式:使用多继承机制: 适配器继承两个类。 只能在支持多继承的编程语言中实现, 如 C++
- 对象适配器模式:使用关联关系: 适配器继承一个类, 封装另一个类对象。 大部分支持面向对象编程范式的编程语言可以实现
类适配器模式
结构
- 被适配类(客户端期望/可以使用/形式上使用的接口;适配者)
- 目标类(客户端不兼容/无法使用/实际上使用的接口;被适配者)
- 适配器类(中间者)
- 适配器类 多继承 被适配类和目标类
- 适配器类 私有继承(封装)被适配类
- 适配器类中 形式上使用的接口 调用 实际上使用的接口(适配过程)
- 客户端可以只知道目标类和适配器类,不知道被适配类
代码
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
| #include <iostream>
using std::cout; using std::endl;
class Adaptee { public: void adaptee_func() const { cout << "adaptee_func()" << endl;
return; } };
class Target { public: virtual void target_func() const = 0; };
class Adapter : public Target, private Adaptee { public: void target_func() const override { Adaptee::adaptee_func();
return; } };
int main() { Target *target = new Adapter(); target->target_func(); delete target;
return 0; }
|
对象适配器模式
结构
- 被适配类(客户端期望/可以使用/形式上使用的接口;适配者)
- 目标类(客户端不兼容/无法使用/实际上使用的接口;被适配者)
- 适配器类(中间者)
- 适配器类 继承 目标类
- 适配器类 封装 被适配类对象
- 适配器类中 形式上使用的接口 调用 实际上使用的接口(适配过程)
- 客户端可以只知道目标类和适配器类,不知道被适配类
代码
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
| #include <iostream>
using std::cout; using std::endl;
class Adaptee { public: void adaptee_func() const { cout << "adaptee_func()" << endl;
return; } };
class Target { public: virtual void target_func() const = 0; };
class Adapter : public Target { public: Adapter() : adaptee() {}
void target_func() const override { adaptee.adaptee_func(); }
private: Adaptee adaptee; };
int main() { Target *target = new Adapter(); target->target_func(); delete target;
return 0; }
|
总结
代理和适配器模式(结构型设计模式)的 C++ 代码示例模板。
参考资料
作者的话
- 感谢参考资料的作者/博主
- 作者:夜悊
- 版权所有,转载请注明出处,谢谢~
- 如果文章对你有帮助,请点个赞或加个粉丝吧,你的支持就是作者的动力~
- 文章在描述时有疑惑的地方,请留言,定会一一耐心讨论、解答
- 文章在认识上有错误的地方, 敬请批评指正
- 望读者们都能有所收获