MyException - 我的异常网
当前位置:我的异常网» VC/MFC » 求范型模式的类设计方案,该怎么处理

求范型模式的类设计方案,该怎么处理

www.myexceptions.net  网友分享于:2013-02-12  浏览:5次
求范型模式的类设计方案
背景:
目前有一批控件类(Button,CheckBox,ListCtrl等),都是继承自Control类。
Control类提供一些通用Virtual方法,继承类按需求改写某些方法。
然后还有各个控件的管理类,比如管理Button的管理类ButtonCollection,负责更换皮肤、删除资源之类的需要集中处理的事务。

现在客户端的调用就比较尴尬,需要定义控件类和管理控件类,比如CMyButton和CMyButtonCollection。

需求:
我希望能有范型的设计把这些郁闷给消灭,然后客户端尽可能充分享受编程的乐趣!我用的WTL库做的开发,所以想尽可能的应用范型模式来设计开发

PS:看着STL和LOKI把范型应用的那么优雅高效,羡慕啊~

------解决方案--------------------
你是想让所有控件的集合,都用范型的容器管理吗?直接用就行了啊?有什么困难?
------解决方案--------------------
觉得还是选择一种设计模式比较好。
可以设计管理类的基类,对每个Control的子类设计一个管理类的子类。
在管理类的基类有一个到Control类的指针,每个管理类的子类负责实例化自己的对象,保证每个控件管理器的子类生成对应的控件。
可以参考Factrory 模式。
------解决方案--------------------
FACTORY METHOD(工厂方法)—对象创建型模式

------解决方案--------------------
特型化呢
------解决方案--------------------
顶 一楼
------解决方案--------------------


class InterfaceBase
{
public:
virtual IDispatch* GetSelfObj() = 0;
};
template< class t>
class cwnd : publc InterfaceBase
{
};
class somewnd :publc cwnd
{
};//
cwnd<somewnd > m_wnd;

就这么个思路
------解决方案--------------------
.
------解决方案--------------------
想法不错,参考一下stl的源码,将Control类设计为模板类啊,反正其负责更换皮肤、删除资源之类的通用的
与控件类型无关的操作。像CMyButtonCollection这样的一种控件类型,一个collection类的方式不好。
------解决方案--------------------
探讨
目前没有用Factory模式,只是在特定类中固定生成控件类,然后Add进Collection进行管理
比如
CMyDialog
{
private:
    CMyButton[2] m_wndBtn;
    CMyButtonCollection m_btnCollection;
};

使用的时候
btnCollection.Add(&m_wndBtn);


现在,我想把Collection做成模板类,基于策略选择不同的控件类。虽然我都把所有控件类通用的行为都抽象了,但是某些控件还是有不同的行为。难点啊


------解决方案--------------------
用到泛型再用公共基类的话,就失去了泛型开销小的优点了。

泛型的设计要点:把设计中的各方面特性都抽取出来,每个特性就是一个模板类型,特性的粒度可大可小。
以你的需求作为例子,你现在需要一个集合管理类,第一步就是构造最粗的粒度:

template<class TControl /*=CMyButton*/ >
class ControlManagerT
{ ... };

接下来你会发现不同控件的使用有些差别(这里假设控件不是从同一个公共基类派生的,否则没必要搞泛型),导致上面的管理模板很难写代码,这时就需要把粒度细化,方法就是把差别的地方再次封装成一个模板类型,假设消息处理机制不同,就为每种控件设计一个消息接受者类(或函数等):

template<class TControl, class TMessageReceiver>
class ControlManagerT
{ ... };

第三步,这里还能继续优化,例如某些控件的消息接受者可以合并,那么可以把 TMessageReceiver 也做成一个模板类,封装一些通用的处理,针对少量控件定义特化模板类,例如:

template<class TControl>
class MessageReceiverT { ... };

template<>
class MessageReceiverT<CMyButton> { ... }; // CMyButton 特化类
... // 可能还有其它特化类

// 管理类就可以这样定义:
template<class TControl, class TMessageReceiver=MessageReceiverT<TControl> >
class ControlManagerT { ... }

上述细化过程可以一直持续下去,直到满足需求为止!等你做下去之后,你就会发现STL/ATL之流都是这样设计的。只不过它们是通用的,所以粒度非常精细,但你自己的实际应用中是不需要这么精细的。

最后的用法:
ControlManagerT<CMyButton> m_btnCollection;

文章评论

一个程序员的时间管理
一个程序员的时间管理
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
中美印日四国程序员比较
中美印日四国程序员比较
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
程序员必看的十大电影
程序员必看的十大电影
Java程序员必看电影
Java程序员必看电影
那些争议最大的编程观点
那些争议最大的编程观点
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
每天工作4小时的程序员
每天工作4小时的程序员
为什么程序员都是夜猫子
为什么程序员都是夜猫子
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
我的丈夫是个程序员
我的丈夫是个程序员
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
代码女神横空出世
代码女神横空出世
旅行,写作,编程
旅行,写作,编程
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
如何成为一名黑客
如何成为一名黑客
总结2014中国互联网十大段子
总结2014中国互联网十大段子
程序员应该关注的一些事儿
程序员应该关注的一些事儿
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
10个调试和排错的小建议
10个调试和排错的小建议
 程序员的样子
程序员的样子
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
程序员和编码员之间的区别
程序员和编码员之间的区别
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
我是如何打败拖延症的
我是如何打败拖延症的
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
编程语言是女人
编程语言是女人
老程序员的下场
老程序员的下场
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
程序员的鄙视链
程序员的鄙视链
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有