YGFaith  
公告
日历
统计
  • 随笔 - 2
  • 文章 - 0
  • 评论 - 6
  • 引用 - 0

导航

 

2008年9月12日

定义:对象间的一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。  

功能:搜索数据库,当有需要公布的数据将其用各种方式发送出去。
  
观察者模式无疑能很好的做到上面的要求,无论要多少种方式,只要增加多个继承之ITransfer接口的派生类即可,有很好的维护性。

以下是实际的应用.



//接口
//ITransfer.h
#pragma once

class ITransfer
{
public:
    
virtual bool DoTransfer(...= 0;
}
;


//FetionTransfer.h
#pragma once
   #include "Transfer.h" 
class CFetionTransfer:public ITransfer
{
public:
    CFetionTransfer();
    
~CFetionTransfer();
    
bool DoTransfer(...);
private:
    ......
}
;


//MailTransfer.h
#pragma once
   #include "Transfer.h"
class CMailTransfer: public ITransfer
{
public:
    CMailTransfer();
    
 ~CMailTransfer();
    
bool DoTransfer(...);
private:
....
}
;


//TransferPool.h
#pragma once

#include 
"Transfer.h"
#include 
<vector>
using namespace std;

class CTransferPool
{
private:
    vector
<ITransfer*> vo;
public:
    
virtual ~CTransferPool();

    
void Login(ITransfer* po);

    
void Logout(ITransfer* po);
   
//向各成员广播消息
    void Notify(...);
}
;

//TransferPool.cpp
#include "TransferPool.h"

CTransferPool::
~CTransferPool()
{
    vector
<ITransfer*>::iterator vi = vo.begin();
    
for (; vi != vo.end(); vi++)
    
{
                 if(*vi)
                    {
                        delete *vi;
                         *vi = NULL;
                    }

    }

}


void CTransferPool::Login(ITransfer* po)
{
    vo.push_back(po);
}


void CTransferPool::Logout(ITransfer* po)
{
    vector
<ITransfer*>::iterator vi = vo.begin();
    
for (; vi != vo.end(); vi++)
    
{
        
if (*vi == po)
            vo.erase(vi);
    }

}


void CTransferPool::Notify(...)
{
    vector
<ITransfer*>::iterator vi = vo.begin();
    
for (; vi != vo.end(); vi++)
    
{
        ITransfer 
*= *vi;
            
        (
*vi)->DoTransfer(...);
    }

}


void main
{
    CTransferPool
*m_pTranPool= new CTransferPool();
    
    CFetionTransfer 
*m_pFetionTran = new CFetionTransfer(...);
    CMailTransfer 
*m_pMailTran = new CMailTransfer(...);

    m_pTranPool
->Login(m_pFetionTran);
    m_pTranPool
->Login(m_pMailTran);
       
        
while(需要发送消息)
        
{
            m_pTranPool
->Notify();
        }


        
//释放
          if(m_pTranPool)
        
{
            delete m_pTranPool;
            m_pTranPool 
= NULL;
        }


}
posted @ 2008-09-12 13:35 YGFaith 阅读(369) 评论(3) 编辑
 

游戏编程是我业余的爱好,也可以提高对编程的兴趣,每当我有时间的时候就会编写游戏,基于图片的问题所以首选小游戏。这是我毕业后第二款小游戏,相比上一款充分的运用了面向对象的技术,让我享受与不断做类的完善,特别提出的是使用递归技术使得算法更加简洁确实是个很不错的技术,比如:游戏中的地图整行消除判断以及消除。

目前的设计情况如下:
(有写没必要的函数省略了,初次使用UML图)

功能不多主要是想做出比较好的类,此贴主要是想探讨类的设计,标题上写了工厂模式,这里只是简单的把UI创建放到另外一个地方罢了,严格来说应该不算是什么工厂,但是主要是代码
易读维护性高就可以了.开发环境:VS2005,WIN32、 C++、DX9


如果要增加其他按钮只要继承ImageUI,和实现基类的存虚拟函数就可以。基类的事件触发如下代码。

PUG_BTN_STAT CImageUI::OnEven(UINT msg, WPARAM wParam, LPARAM lParam)
{
    POINTS xy;
    xy 
= MAKEPOINTS(lParam);
    POINT xy2;
    xy2.x 
= xy.x;
    xy2.y 
= xy.y;

    
switch(msg)
    {      
    
case WM_MOUSEMOVE:
           {
            
if(PtInRect(&_displaySize,xy2))
            {
                OnPass();
                
return PASS;
            }
           }
           
break;
      
case WM_LBUTTONDOWN:
           {
            
if(PtInRect(&_displaySize,xy2))
            {
                OnClick();
                
return ONCLICK;
            }
           }
           
break;
      
case WM_LBUTTONUP:
          {
            
if(PtInRect(&_displaySize,xy2))
            {
                OnClickOut();
                
return ONCLICKOUT;
            }
          }
          
break;
    }

    OnPassOut();
    
return COMMAND;
}


游戏图片如下:




游戏下载:
/Files/YGFaith/elsfkGame.rar
posted @ 2008-09-12 09:16 YGFaith 阅读(1995) 评论(3) 编辑
 
Copyright © YGFaith Powered by: 博客园 模板提供:沪江博客