GUI - 调用setter或dispatch事件?

时间:2012-04-12 09:36:15

标签: actionscript-3 oop design-patterns

我正在开发一个先进的模块化GUI系统。我需要它尽可能灵活,并希望对尽可能多的人有用(但这将是合理的利基)。

我的设计中让我思考的部分是每个组件应该如何与应用程序的其余部分进行最佳交互。

我看到两种方法:

  1. 传递一个setter的类和名称,组件应该对其进行操作。如果需要,这仍然允许从setter中调度事件。
  2. 传入组件应调度的CustomEvent以及相关数据。虽然我觉得这可能会导致很多事件监听器,并且会增加额外的复杂性。
  3. 但什么是最佳做法?各自的优点和缺点是什么?有更好的方法吗?

    1. 基本示例:

      public class Button extends Sprite
      {
      private var _property:String;
      private var _object:*;
      
      public function Button(label:String, object:*, property:String) 
      { 
          _property = property;
          _object = object;
          addEventListener(MouseEvent.CLICK,  onClick);
      } 
      
      private function onClick(e:MouseEvent):void
      {
          _object[_property] = "Changed";
      }
      
      }
      
    2. 基本示例:

      public class Button extends Sprite
      {
      private var _event:GuiEvent;
      
      public function Button(label:String, event:GuiEvent) 
      {
          _event = event;
          addEventListener(MouseEvent.CLICK,  onClick);
      }
      
      private function onClick(e:MouseEvent):void
      {
          dispatchEvent(new GuiEvent(_event.type, "Changed"));
      }
      
      }
      

2 个答案:

答案 0 :(得分:0)

如果您希望GUI框架对每个人都有用,您应该使用标准事件而不是发明新事件。第二种选择是要走的路,但你应该尽量保持简单。您在示例2中编写的代码看起来非常复杂。它可以简单地写成:

public class Button extends Sprite
{

    public function Button(label:String) 
    {
    }

}

然后任何人都可以使用他们所知道的事件来处理点击:

button.addEventListener(MouseEvent.CLICK, onClick);

答案 1 :(得分:0)

稍微偏离主题,而不是你问题的答案:

为什么要重新创建已经存在的东西?已有经过验证的GUI组件库。

例如,参加AS3 Temple Library
http://code.google.com/p/templelibrary/

它具有所有类型的表单元素组件;复选框,单选按钮,组合框,输入字段,文件字段,滚动组件,日期选择器,(步骤)滑块,列表,滚动条,自动完成字段和所有类型的按钮。 它还有一个Form类,它有助于验证,将数据传递给任何类型的服务。它还正确管理tabindexes,所有控件也可以与键盘一起使用,就像每个人都希望它能够工作一样。还有用于模型的代码组件,但是您可以使用相同的代码来设置样式,使用库项目,时间轴或您想要的无限创造力。大多数gui组件都经过精心设计,可以扩展以满足您的需求。

大多数gui组件使用普通的eventlisteners(大多数情况下在内容更改时调度Event.CHANGE),在大多数情况下,不需要将其包装到新类型的事件中。