文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

1.背景

从这一章节开始我们将正式进入WebGIS的工具栏中相关功能的设计和实现。我们以ArcMap中的工具栏中的基本工具为模板,将其中的放大、缩小、平移、全图、清除、定位、I查询、距离量测、面积量测在WebGIS中进行实现。

这里,我先跟大家说一个基本的概念。我们一般将工具分为Command和Tool。所谓command是指该工具被调用后,生效一次即终止。而Tool则是当被调用后,持续有效,直至终止该工具或者切换工具。

按照这个理论,我们可以将工具栏中的基本工具分一下类:

Command:全图、清除、定位。

Tool:放大、缩小、平移、I查询、距离量测、面积量测。

2.初步探究

对工具栏中的内部控制哪一个工具该实例化以及生效,可以通过策略模式+工厂模式。但是为了简单,策略模式就足以了。

但是,因为工具栏中有诸多Tool型的工具,简单的策略模式是无法满足Tool终止和切换的需求的。这里我们将用到23种设计模式中的一种:命令模式。

3.命令模式简介

3.1 使用场景

GOF中给出了命令模式的使用场景:

A、当一个应用程序调用者与多个目标对象之间存在调用关系时,并且目标对象之间的操作很类似的时候。

B、当一个目标对象内部的方法调用太复杂,或者内部的方法需要协作才能完成对象的某个特点操作时(作者注:比如要对行为进行“记录、撤销/重做、事务”等处理)。

C、调用者调用目标对象后,需要回调一些方法。

分析我们Tool的使用,均是与鼠标事件有关,比如:mouseDown、mouseUp、mouseMove、mouseOut、mouseClick、mouseWheel等。是满足命令模式使用的场景A的,而场景B和C也是很有可能会在我们使用中触发的。

综上分析,进一步证明我们这里选着使用命令模式是正确的。

3.2命令模式讲解

这里我先给出命令模式的UML图:

           
以上UML图中涉及到五个角色,它们分别是:

客户端(Client)角色:创建一个具体命令(ConcreteCommand)对象并确定其接收者。

命令(Command)角色:声明了一个给所有具体命令类的抽象接口。

具体命令(ConcreteCommand)角色:定义一个接收者和行为之间的弱耦合;实现execute()方法,负责调用接收者的相应操作。execute()方法通常叫做执行方法。

请求者(Invoker)角色:负责调用命令对象执行请求,相关的方法叫做行动方法。

接收者(Receiver)角色:负责具体实施和执行一个请求。任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法。

4.系统中命令模式的具体实现

在实际运用中 ,我们经常会对GOF给出的设计模式中的UML稍作变通,以便简化开发或者便于开发。这里,我们也对以上的UML做了些许变化。

我这里先给出变化后的UML图。

因为所有的命令都是针对于Map的,所以没有将Command设计成接口,而是让他变成一个抽象类,这样有两个好处:

A.使Map变为属性,直接让Command关联上Map。

B.可以在类中完成部分公用代码,比如mouseWheel()方法所涉及的功能是所有的命令类公用的。

并且舍弃了Receiver这样的接受者的编写,而是直接将Receiver中所涉及到的方法编写移到每一个ConcreteCommand中了。这样可以减少类的个数。

命令的切换由类似于Invoke类的MapNavigation类中的setMapCommand来控制。

5.使用命令模式的优点

A.更松散的耦合:

命令模式使得发起命令的对象——客户端,和具体实现命令的对象——接收者对象完全解耦,也就是说发起命令的对象完全不知道具体实现对象是谁,也不知道如何实现。

B.更动态的控制:

命令模式把请求封装起来,可以动态地对它进行参数化、队列化和日志化等操作,从而使得系统更灵活。

C.很自然的复合命令:

命令模式中的命令对象能够很容易地组合成复合命令,也就是宏命令,从而使系统操作更简单,功能更强大。

D.更好的扩展性:

由于发起命令的对象和具体的实现完全解耦,因此扩展新的命令就很容易,只需要实现新的命令对象,然后在装配的时候,把具体的实现对象设置到命令对象中,然后就可以使用这个命令对象,已有的实现完全不用变化。

6.总结

在这一章里,我们介绍了命令模式的设计和实现思路。在接下来的章节里,我们将针对我提到的工具栏中的基本工具:放大、缩小、平移、全图、清除、定位、I查询、距离量测、面积量测,的设计和实现进行逐个讲解。欢迎大家持续关注。

-----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

如果您觉得本文确实帮助了您,可以微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^

                                      

(十三)WebGIS中工具栏的设计之命令模式的更多相关文章

  1. AF(操作者框架)系列(2)-在Actor框架中派生Actor核心(命令模式)

    为了能够提高程序的复用性,我们准备用Actor Framework框架,来演示其满足了这个需求(本章及后面的内容,需要有OOP的基础知识). 首先,简述一下ActorFramework的运行过程: 在 ...

  2. C#设计模式(15)——命令模式(Command Pattern)

    一.前言 之前一直在忙于工作上的事情,关于设计模式系列一直没更新,最近项目中发现,对于设计模式的了解是必不可少的,当然对于设计模式的应用那更是重要,可以说是否懂得应用设计模式在项目中是衡量一个程序员的 ...

  3. C++设计模式——命令模式

    什么是命令模式? 在GOF的<设计模式:可复用面向对象软件的基础>一书中对命令模式是这样说的:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以 ...

  4. 【16】命令模式(Command Pattern)

    一.前言 最近项目中发现,对于设计模式的了解是必不可少的,当然对于设计模式的应用那更是重要,可以说是否懂得应用设计模式在项目中是衡量一个程序员的技术水平,因为对于一个功能的实现,高级工程师和初级工程师 ...

  5. 命令模式(head first 设计模式5)

    一.命令模式定义 命令大家都不会陌生,那么在开始命令模式之前,可以想象一下生活中的命令模式的特点: 如老板命令你完成一个OA项目是一个命令,接着看看其特点: 1.在上面的命令中,命令的执行者肯定是聪明 ...

  6. C#设计模式之11:命令模式

    C#设计模式之11:命令模式 命令模式 命令模式用来解决一些复杂业务逻辑的时候会很有用,比如,你的一个方法中到处充斥着if else 这种结构的时候,用命令模式来解决这种问题就会让事情变得简单很多. ...

  7. 14.java设计模式之命令模式

    基本需求: 一套智能家电,有照明灯.风扇.冰箱.洗衣机,我们只要在手机上安装app就可以控制对这些家电工作 这些智能家电来自不同的厂家,我们不想针对每一种家电都安装一个App分别控制,我们希望只要一个 ...

  8. JavaScript设计模式之命令模式

    一.命令模式概念 命令模式(Command)的定义是:用来对方法调用进行参数化处理和传送,经过这样处理过的方法调用可以在任何需要的时候执行.也就是说该模式旨在将函数的调用.请求和操作封装成一个单一的对 ...

  9. 设计模式--命令模式(Command)

    基本概念:  Command模式也叫命令模式 ,是行为设计模式的一种.Command模式通过被称为Command的类封装了对目标对象的调用行为以及调用参数,命令模式将方法调用给封装起来了. 命令模式的 ...

随机推荐

  1. WPF整理-使用ResourceDictionary管理Logical Resources

    “Logical resources may be of various types, such as brushes, geometries, styles, and templates.Placi ...

  2. 远程桌面连接 win7 主机提示“您的凭据不工作”的解决办法

    搞了大半天,找了百度N中方式操作,至少翻看10种以上解决方式,结果还是不得行 索性使用了360搜索,搜了几次就搞定了. 解决办法: “ 最重要一点, 主机上要允许用户以非guest身份登录:主机上运行 ...

  3. doduicms 手机和pc同步 链接处理

    sitem.aspx 加上 Session.Add("ismobile", "1"); string mobile = HttpContext.Current. ...

  4. CSS基础篇之了解CSS和它的基本属性

    CSS是什么? CSS英文全名是Cascading Style Sheets翻译过来就是层叠样式表,它主是把网页表现与内容分离的一种样式设计语言.这种语言能优化我们编程,把东西简化和优化写法,而且不同 ...

  5. UnderScore源代码阅读1

    读一下underscore源代码,用于自己学习,个人理解,如果有不对的地方希望指正,谢谢 我觉着阅读的顺序按照从整体到局部,从架构到细节较好. 1.整体架构 (function() {}.call(t ...

  6. 转:隐马尔可夫模型(HMM)攻略

    隐马尔可夫模型 (Hidden Markov Model,HMM) 最初由 L. E. Baum 和其它一些学者发表在一系列的统计学论文中,随后在语言识别,自然语言处理以及生物信息等领域体现了很大的价 ...

  7. IOS9.0中hash值的bug与解决方案

    事件起因 事情是这样的:产品上线发布,突然出现了问题.运营Gg过来反应,当场给露珠演示,运营同事的手机是iphone,bug确实是存在的.奇怪的是露珠用了其他iphone手机(借别人的,露珠的是吊死安 ...

  8. C语言 · 动态数组的使用

    从键盘读入n个整数,使用动态数组存储所读入的整数,并计算它们的和与平均值分别输出.要求尽可能使用函数实现程序代码.平均值为小数的只保留其整数部分. 样例输入: 5 3 4 0 0 2样例输出:9 1样 ...

  9. 有关bootstrap之排版

    1.标题 HTML中的所有标题标签,从<h1> 到 <h6> 均可用.另外,还提供了.h1 到.h6 class,为的是给inline属性的文本赋予标题的样式. 在标题内还可以 ...

  10. java反射 之 反射基础

    一.反射 反射:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为 ...