对设计模式的一点认识
2012-05-27 22:26
190 查看
在编码的这些年里,在软件详细设计方面有了一些心得,拿出来和大家分享一下。如有欠妥之处,望不啬赐教。
1. 单例模式: 单例模式在程序中经常用到的模式。但是,应用此模式的时候,特别的要注意多线程的问题。在单例对象创建、销毁和使用过程中,都会出现多个线程竞速的情况。
2. 装饰模式和职责链模式实质上是一种思想,类自身包含自己的一个指针。这样就有机会把实例化后的对象串联起来。
例如MFC中的消息路由,就是采用职责链的方式,对消息进行路由的。不过MFC实现的方式,比上诉的模型要复杂一些。
消息类是通过上诉的结构进行路由的。具体的步骤如下:
![](http://my.csdn.net/uploads/201207/09/1341821352_4234.JPG)
如果找到当前的窗口对象,那么,将执行下列代码
也就是说,消息先到窗口函数中去寻找消息响应函数,然后,查找它的所有者窗口,最后是当前的线程。而OnCmdMsg函数正是职责链的很好的应用,查看OnCmdMsg的代码,如下:
外层的循环,就是按照职责链中的指针进行查找。
3. 个人发现,在一般类的设计中,大部分可套用的一种结构。如图1所示。其中Manager、Control、Context在逻辑上可理解为决策调度角色、控制逻辑角色、应用上下文环境角色。Object可以理解为业务对象。个人在编程过程中,遇到一时还搞不明白如何划分功能职责的情况时,就会先把类结构设计成图1中的形式。
符合这种方式的设计模式有如下几种:
实际上在交互软件中,很多设计都是把业务分割成控制角色的类和实体对象角色的类。在MVC的三个角色中的关系,都可以套用到这写结构。
1. 单例模式: 单例模式在程序中经常用到的模式。但是,应用此模式的时候,特别的要注意多线程的问题。在单例对象创建、销毁和使用过程中,都会出现多个线程竞速的情况。
2. 装饰模式和职责链模式实质上是一种思想,类自身包含自己的一个指针。这样就有机会把实例化后的对象串联起来。
装饰模式 | 职责链模式 |
struct AFX_MSGMAP { const AFX_MSGMAP* pBaseMap; const AFX_MSGMAP_ENTRY* lpEntries; }; #define DECLARE_MESSAGE_MAP() \ private: \ static const AFX_MSGMAP_ENTRY _messageEntries[]; \ protected: \ static const AFX_MSGMAP messageMap; \ virtual const AFX_MSGMAP* GetMessageMap() const; \
消息类是通过上诉的结构进行路由的。具体的步骤如下:
如果找到当前的窗口对象,那么,将执行下列代码
if (CWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo)) return TRUE; CWnd* pOwner = GetParent(); if (pOwner->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo)) return TRUE; CWinThread* pThread = AfxGetThread(); if (pThread->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo)) return TRUE;
也就是说,消息先到窗口函数中去寻找消息响应函数,然后,查找它的所有者窗口,最后是当前的线程。而OnCmdMsg函数正是职责链的很好的应用,查看OnCmdMsg的代码,如下:
for (pOleCommandMap = GetCommandMap(); pOleCommandMap != NULL && !bResult; pOleCommandMap = pOleCommandMap->pBaseMap) { for (pEntry = pOleCommandMap->lpEntries; pEntry->cmdID != 0 && pEntry->nID != 0 && !bResult; pEntry++) { if (nID == pEntry->cmdID &&IsEqualNULLGuid(pguidCmdGroup, pEntry->pguid)) { pUI->m_nID = pEntry->nID; bResult = TRUE; } } }
外层的循环,就是按照职责链中的指针进行查找。
3. 个人发现,在一般类的设计中,大部分可套用的一种结构。如图1所示。其中Manager、Control、Context在逻辑上可理解为决策调度角色、控制逻辑角色、应用上下文环境角色。Object可以理解为业务对象。个人在编程过程中,遇到一时还搞不明白如何划分功能职责的情况时,就会先把类结构设计成图1中的形式。
图1 一种常用的设计结构 |
工厂模式:通常是通过配置文件,生成不同的对象 |
策略模式:通常是通过运行上下文,选择适当的决策方式 |
观察者模式:这里的模型角色实际上不单纯是数据,还担负了当某些数据发生变化时,通知已注册过的监听者(通常是Viewer,也可以是一些逻辑状态)发生变化 |
中介者模式:控制逻辑都集中在中介者角色 |
相关文章推荐
- 对于设计模式的一点粗略认识
- 关于对设计模式的一点认识
- 读"大话"认识23种设计模式
- 每天学一点设计模式-观察者模式
- 对设计模式的一点理解
- 认识设计模式的概念原理(二)
- 每天学一点设计模式-适配器模式
- 关于设计模式的一点感想
- 单例设计模式的一点总结
- 设计模式(十二):通过ATM取款机来认识“状态模式”(State Pattern)
- 从头认识设计模式-策略模式-06-对前面几个章节思考的总结
- 关于设计的度的一点小认识
- 认识观察者模式(设计模式)[转载]
- 工作三年,对于设计模式的一点看法
- 单例设计模式的一点心得
- 每天学一点设计模式-单例模式
- 对设计模式—Adapter模式的认识 - flysnail-妙不可言,美不胜收 - JavaEye技术网站
- 认识设计模式的概念原理(三)
- 设计模式_第三篇_我对模式的了解和认识
- 每天学一点设计模式-状态模式