学习AA大神c++设计新思维笔记:01基于策略的类设计
基于策略的类设计
增加程序弹性,并提高复用性.具备复杂功能的基于策略的类由许多小类
组成.小类,负责行为/结构
单一功能
全功能接口即大类
,是不行的.良好设计应在编译期就能进行很好的约束(断定
).
多重继承,无法解决单独设计时的多样性.模板很适合组合
.多重继承,很容易扩张,但欠缺技术
.而模板丰富技术,有类型信息,无法扩张
.因而可结合模板/多重继承
.因为两者互补.
策略,用来定义类/类模板
接口.与编译期
紧相关.
元<类 T>
类 新创建{
静 T*创建(){
中 新 T();
}
...
};//还可以用(新(缓冲) T);创建
元<类 T>类 原型策略{
原型策略(T*p=0):p原型(p){}
T*创建(){
中 p原型?p原型->复制():空针;
}
T*取原型(){中 p原型;}
空 置原型(T*p){p原型=p;}
私:
T*p原型;
};
实现策略的类叫策略类
,有点像当前c++的概念
,采用了策略类
的类叫主机类
.
元<类 策略>
类 继承:公 策略{
...
};
这样实现时,就必须提供策略
.自行装配策略.
元<元<类 呀>类 策略>
类 继承:公 策略<小件>{
...
};
用 我的=继承<策略类>;//这个模板参数,仍为模板
这个继承
就像个小型代码生成器.然后定义些常用策略
.并=默认策略类
.策略可保证类型安全
,一般使用模板类
定义策略.
而协议提供者(某策略类)
还有附加的函数.公继承
时,可使用其附加函数.而采用其余策略类时,编译器通知有误(用了附加函数).使你在类型安全下扩充主机类
.
删
指向策略类指针,是未定义
行为.应尽量避免虚析构
.妨碍静态链接
,且影响执行效率
.可在策略类中
搞一个保护的析构函数
.只能主机类删
,且无虚,则快
.
还可以切换:
元<元<类>类 创建策略>
类 继承:公 创建策略<小件>{
...
空 切换协议(小件*w){
创建策略<小件>&p=*本;
删 p.取协议();
p.置协议(w);
}
};
用 我的=继承<策略类>;//这个模板参数,仍为模板
如果,使用支持协议策略类
,则可使用该函数.而不支持协议策略类
的不能使用该函数,但如果不使用,仍然可以通过编译.
这是不完全实例,使用者,可以设定原型
.
多个策略组合
时最有用.主机类,用数个策略来帮助自己.用户借不同策略
达到目的.
如灵针<T,检查策略,线程模型>
.线程模型:单线程/多线程.检查:检查/不检查.随意组合.
模板不支持定制
结构,可定制行为
,而基于策略设计
则可定制结构.如结构策略
将抽象存储指针
的动作.提供指针/引用
类型.缺省为默认指针.抽象出指针类型
.比如段的近/远指针
或窗口中的句柄
.
快针不检验,安全针要检验,能将快针
->安全针
吗?核心地方用快针
.只有在明确受控时允许安全针->快针
.
用策略
来控制拷贝/初化
对象.
进行策略转化时,两边都有弹性.如想用灵针<扩展小件,不检查>
初化灵针<小件,确保非空>
时,如果确保非空
可接受不检查
对象的构造函数,或不检查
可实例化成确保非空
的转换操作,都可编译成功.如无转换,则编译不过.赋值操作可根据复制构造函数实例化赋值操作符
.
在引用计数->所有权策略
时,则不能乱转换了.会出问题,因为破坏了不变性
,即两者性质根本不同.
基于策略设计最难的是分拆.如何正确将类分拆为策略
.只要某件事可通过多种方法
解决,都可分拆为策略.如将集合
设计为存储策略
,随时就可改了.
极端时,主机类就是一堆策略类
的集合.作为外壳.策略既不要太多,也不能没有.然后用用 D=灵针<A,B,C>;
来简化操作,策略的主要目的,是为了抽象.
策略间独立,才算正交
.不正交,就得暴露,破坏封装性.
候捷
那本的中文翻译.引数
->参数
.
软件设计重要的是不要修改,只增加
.一句话,用模板类实现策略
.
可以这样思考:这像函数
作为一些模板函数的模板参数
(如判定函数
)一样.模板类
作为模板类
的参数.这样更方便.因为类
就是个大函数
.通过大量
的小策略
来实现不同功能.
型列在今天应该也有用.比如元<型名...T,型名...M>
这样就非常难处理.如果直接用<元组>,仍然很麻烦.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现