动态响应事件

时间:2009-03-28 15:09:38

标签: design-patterns

我有三个组成部分。 Windows窗体控件(自定义),主类和插件类。

该插件会生成一个更新事件,其中应该向控件添加一些内容。这可能是一个字符串,一个带有url的字符串,或者是另一个控件,但也许将来会有其他内容。

设计这样的东西的最佳方法是什么?

修改

我应该更清楚一点。我想解决的问题是如何对特定项目做出不同的反应。

例如:插件可能只是选择添加一些文本。它调度一个事件,主类应该调用相应的方法。但是另一个插件可能会选择添加自定义控件,因此主类需要调用不同的方法。

如何设计主要类对特定事件采取不同行为的部分。

(顺便说一下,不要太过文字了。现在,他们只是项目中的课程。)

3 个答案:

答案 0 :(得分:0)

听起来很简单。我建议为你的插件类使用一个接口。

interface IPlugin
{
    event EventHandler PluginUpdateEvent;
}

你的表单类或你的主类将包含一个集合或一组插件,无论要求是什么,然后发现它们你需要 - 通过反射,构造函数注入,配置文件,无论什么是最好的。

加载插件后,您将确保表单订阅了该插件的PluginUpdateEvent,并添加了一个事件处理程序来处理该事件并添加表单所需的任何内容。

答案 1 :(得分:0)

答案 2 :(得分:0)

使用模型 - 视图 - 控制设计模式,并在视图中传递您希望它们运行的​​callBackFunction。看到这个:

-- the code is in LUA
-- **** I create an answerBox, and when user tap this answerBox I want to print->"test"

local answerBox = require "view.answerBox"
local test = answerBox:new()
test.init("text for your answerBox", "1", function () print "answerBox was tapped by the user" end)

并且在answerBox类中我得到函数并在点击对象时调用它:

-- constructor
function new( self, message, id, callBackFunction, obj )
    function callBackFunction( event )            
        callBackFunction(event)
    end
    obj.answerBox:addEventListener( "tap", callBackFunction )
end

使用此结构时要小心。在这个结构中,answerBox类在View中,而CallBackFunction在控制器中。您甚至可以使用模型中的某些逻辑而不是function () print "test" end

希望这会有所帮助。 ;)