学习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>这样就非常难处理.如果直接用<元组>,仍然很麻烦.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值