Policy-Based Design是一种编译期静态多态的泛型架构,通过模板参数将正交策略类(如检查、线程模型)组合进主类,实现零开销、类型安全的行为装配,区别于运行时虚函数策略模式。

Policy-Based Design(基于策略的设计)不是一种运行时切换行为的模式,而是一种在编译期就把行为“装配好”的泛型架构方式。它的核心思想是:把一个类中可变、正交的行为(比如检查逻辑、线程模型、序列化方式、日志策略等)抽出来,做成独立的策略类(policy class),再通过模板参数组合进主类——就像搭积木,主类是底座,策略是可换的模块。
策略类怎么写?关键有三点
策略类本身通常是模板类,接受一个或多个类型参数(常为被管理的原始类型 T),只负责提供一组约定好的接口(如 Check()、Lock()、Message())。它不依赖主类,也不继承任何东西,职责单一、高内聚。
- 必须是类模板,例如
template<class t> struct StrictChecking { static void Check(T* p) { /*...*/ } };</class> - 接口名和签名需统一,方便主类直接调用,不依赖虚函数或动态绑定
- 通常定义为
struct或class,成员多为static函数或protected工具方法,便于被主类继承或 using 引入
主类怎么组合策略?模板模板参数是关键
主类用 模板模板参数(template template parameter)接收策略类,而不是具体实例。语法形如:template<class t template> class CheckingPolicy></class>。这样既能约束传入的是“能接受一个类型参数的类模板”,又保留了策略对 T 的定制能力。
- 主类常通过多重继承公开策略(
public CheckingPolicy<t>, public ThreadingModule<t></t></t>),直接获得其接口 - 也可用 CRTP(奇异递归模板模式)让策略访问主类内部(如
ThreadingModule<smartptr></smartptr>),实现更紧密协作 - 所有策略选择都在编译期完成,零运行时开销,类型安全,且支持 SFINAE 和 concept 约束
和传统策略模式有什么区别?
传统策略模式靠运行时多态(基类指针 + 虚函数),适合行为频繁切换的场景;Policy-Based Design 是编译期静态多态,适合性能敏感、配置固定、需要强类型保障的系统级组件。
还木有评论哦,快来抢沙发吧~