posts - 94, comments - 250, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
看到Fox发表关于成员函数的消息映射的文章,也忍不住发表的一点自己的观点,希望对大家有所帮助。
其实也就是COMMAND模式的简单实现,看代码吧。
1. XGUIEventHandlerPointer.h
namespace XGUI
{
    
class EventHandlerSlot
    {
    
public:
        
virtual ~EventHandlerSlot() {};
        
virtual void execute(const EventArgs& args) = 0;
        
virtual void* getClass() = 0;
    };

    template
<typename T>
    
class EventHandlerPointer :
        
public EventHandlerSlot
    {
    
public:
        typedef 
void (T::*EventHandler)(const EventArgs&);
    
public:
        EventHandlerPointer() :
            d_undefined(
true),
            d_object(NULL)
        {}
        EventHandlerPointer(EventHandler func, T
* obj) :
            d_function(func),
            d_object(obj),
            d_undefined(
false)
        {}
        
virtual ~EventHandlerPointer() {}

        
void execute(const EventArgs& args)
        {
            
if(!d_undefined) 
                (d_object
->*d_function)(args);
        }

        
void* getClass()
        {
            
return static_cast<void*>(d_object);
        }

    
protected:
        EventHandler    d_function;
        T
*                d_object;
        
bool            d_undefined;
    };
}

2. XGUIWidget.h
 
namespace XGUI
{
    
// 
    class Widget
    {
    
public:
        template
<typename T> void addWidgetEventHandler(WidgetEvent EVENT, void (T::*function)(const EventArgs&), T* obj)
        {
            mWidgetEventHandlers[EVENT].push_back(
new EventHandlerPointer<T>(function,obj));
        }
        
void addWidgetEventHandler(WidgetEvent EVENT, EventHandlerSlot* function)
                {
            mWidgetEventHandlers[EVENT].push_back(
new EventHandlerPointer<T>(function,obj));
        }
                
bool Widget::fireWidgetEvent(WidgetEvent EVENT, EventArgs& args)
                {
                      
// If there are no User defined event handlers we are done.
                      if(mWidgetEventHandlers[EVENT].empty())
                       
return false;
                    
                      
// Execute registered handlers
                      std::vector<EventHandlerSlot*>* userEventHandlers = &(mWidgetEventHandlers[EVENT]);
                      
for(std::vector<EventHandlerSlot*>::iterator it = userEventHandlers->begin(); it != userEventHandlers->end(); ++it )
                       (
*it)->execute(args);
                    
                      
return true;
             }
        
// .
    };
}

以上只为部分代码。

Feedback

# re: 关于成员函数的Command模式的简单实现  回复  更多评论   

2008-10-11 12:07 by RichardHe
很强大!

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理