[MapEasy]浅析ListenerSupport
[MapEasy]浅析ListenerSupport?
-Written by 浪子@cnblogs.com (07-03-30)
摘要:
昨天在cresposhi的关于昨天下午MapEasy QQ群中出现问题的说明里面看到了某些朋友对ListenerSupport的疑问.昨天刚好也爬完了代码,趁睡觉前对照cresposhi的MapEasy UML类图,稍微看了源代码,略有所得,暂且抛砖引玉,希望有更多的人可以理解并加入MapEasy团队,个人觉得GIS的前途无可限量.
1、什么是ListenerSupport?
个人认为这个类的名字有点名不符实。因为这个类的作用是集合所有的Listener对象,并按不同的事件类型进行区分,比如drap,click等等。所以你可以直观的理解为这是个ListenerList。
对象的收集涉及到新增(addListener、addFirstListener),删除(removeListener)这些基本操作。但是如果仅仅只有这些操作那并没有太大的意义。所以ListenerSupport还有自己的行为:触发listener集合中相关的listener的PropertyChange事件(firePropertyChange)。
这样来说ListenerSupport更应该理解为Map的事件发布订阅中心,主管着map的所有动态变化。
2、MapEasy的运作流程(ListenerSupport如何起作用)?
首先,先了解ListenerSupport对listener的存储形式。
this.listeners是个数组的数组,每一个成员数组存放着相同类型的所有listener对象。比如:
this.listeners["drap"]收集所有有关drap的listener对象.
那么收集这些对象有什么用呢?是为了当指定事件发生之后,可以通知所有的监听对象,好让他们做出相应的动态变化.
举个具体的例子来说明:
1、理解Commond是ListenerSupport的一个代理类,通过exce方法来调用listenerSupport的fire事件。
2、查看底下的DragAction实例.
function DragAction(mapModel) { BaseAction.apply(this, new Array(mapModel)); //~ Method /** * 构造函数 */ { // 注册 Command 对象的监听器 command.addListener("drag", this); } this.propertyChange = function(param, newValue) { if (newValue != null && newValue[0] == this.model.getId()) { if (param == "drag") { var offset = newValue[1]; if (offset.x != 0 && offset.y != 0) { var centerCoord = this.model.getViewerCenterCoord(); newX = centerCoord.x - offset.x * MapModel.bound.getWidth() / (this.model.getZoom().getBorderTilesNum() * MapModel.tileSize); newY = centerCoord.y + offset.y * MapModel.bound.getHeight() / (this.model.getZoom().getBorderTilesNum() * MapModel.tileSize); var newCoord = new Coordinate(newX, newY); if (!newCoord.same(centerCoord)) { this.model.setViewerCenterCoord(newCoord); } } } } } }
在构造函数里面,将本身的监听对象加入到了监听集合的drag分类里面(command.addListener("drag", this);),这个时候只要map触发drap事件,则listenerSupport会负责触发它集合里面的所有率属于drag类别的监听者,从而触发他们的propertChange事件,让他们根据参数newValue做出drag动作(即上述代码中的动作).
3、浪子语
其实觉得关于这个问题并没有需要讨论的地方,只要自己稍微看看代码就可以明白其意图,不过看到有朋友有一定的困惑,而又在我力所能及的范围,所以罗嗦罗嗦的胡乱阐述一下。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述