对设计模式的一点认识
来源:互联网 发布:蔬东坡软件多少钱 编辑:程序博客网 时间:2024/06/05 18:33
在编码的这些年里,在软件详细设计方面有了一些心得,拿出来和大家分享一下。如有欠妥之处,望不啬赐教。
1. 单例模式: 单例模式在程序中经常用到的模式。但是,应用此模式的时候,特别的要注意多线程的问题。在单例对象创建、销毁和使用过程中,都会出现多个线程竞速的情况。
2. 装饰模式和职责链模式实质上是一种思想,类自身包含自己的一个指针。这样就有机会把实例化后的对象串联起来。
装饰模式职责链模式例如MFC中的消息路由,就是采用职责链的方式,对消息进行路由的。不过MFC实现的方式,比上诉的模型要复杂一些。
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,也可以是一些逻辑状态)发生变化中介者模式:控制逻辑都集中在中介者角色实际上在交互软件中,很多设计都是把业务分割成控制角色的类和实体对象角色的类。在MVC的三个角色中的关系,都可以套用到这写结构。
- 对设计模式的一点粗浅认识
- 关于对设计模式的一点认识
- 对设计模式的一点认识
- 对设计模式的认识
- 对框架设计模式的认识小结
- 对Final的一点认识
- 对Final的一点认识
- 对项目的一点认识
- 对maven的一点认识
- 对MongoDB的一点认识
- 对堆栈的一点认识
- 对readResolve的一点认识
- 对线程的一点认识
- 对DLL的一点认识
- 对QT的一点认识
- 对嵌入式的一点认识
- 对ContentProvider的一点认识
- 对设计模式—Flyweight模式的认识
- 链表逆序面试题
- (百例编程)20.一个奇异的三位数
- 请各位大侠帮下忙,小弟刚学java不久,老师就布置了一个大作业
- linux中创建多个子进程的方法
- (百例编程)21、4位反序数
- 对设计模式的一点认识
- 用Lua开发iphone程序
- Spring概览
- 十一、抽象工厂模式
- (百例编程)22.求车速
- WinMain函数无法重载
- (百例编程)23.由两个平方三位数获得三个平方二位数
- 设计模式:抽象工厂模式(Python)
- 禁用浏览器后退之方法