对设计模式的一点认识

来源:互联网 发布:蔬东坡软件多少钱 编辑:程序博客网 时间: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的三个角色中的关系,都可以套用到这写结构。

	
				
		
原创粉丝点击