(十三)WebGIS中工具栏的设计之命令模式

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://home.cnblogs.com/u/naaoveGIS/

时间: 2024-09-29 05:54:45

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

C#面向对象设计之——命令模式(十五)

一.前言 命令模式将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,另外对请求排队或记录请求日志,以及支持可撤销的操作. 二.结构图 三.实例代码 namespace 命令模式 { class Program { static void Main(string[] args) { //开店前的准备 Barbecuer boy = new Barbecuer(); Command bakeMuttonCommand1 = new BakeMuttonCommand(boy); Co

【游戏设计模式】之二 实现撤消重做、回放系统的神器:命令模式

本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/52663057 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 这篇文章将与大家一起探索游戏开发中命令模式的用法. 命令模式的成名应用是实现诸如撤消,重做,回放,时间倒流之类的功能.如果你想知道<Dota2>中的观战系统.<魔兽争霸3>中的录像系统.<守望先锋>

15.设计模式_命令模式

一.前言 之前一直在忙于工作上的事情,关于设计模式系列一直没更新,最近项目中发现,对于设计模式的了解是必不可少的,当然对于设计模式的应用那更是重要,可以说是否懂得应用设计模式在项目中是衡量一个程序员的技术水平,因为对于一个功能的实现,高级工程师和初级工程师一样都会实现,但是区别在于它们实现功能的可扩展和可维护性,也就是代码的是否"优美".可读.但是,要更好地应用,首先就必须了解各种设计模式和其应用场景,所以我还是希望继续完成设计模式这个系列,希望通过这种总结的方式来加深自己设计模式的理

设计模式 命令模式 之 管理智能家电

继续设计模式哈,今天带来命令模式,二话不说,先看定义: 定义:将“请求”封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持可撤销的操作. 这尼玛定义,看得人蛋疼,看不明白要淡定,我稍微简化一下:将请求封装成对象,将动作请求者和动作执行者解耦.好了,直接用例子来说明. 需求:最近智能家电很火热啊,未来尼玛估计冰箱都会用支付宝自动买东西了,,,,假设现在有电视.电脑.电灯等家电,现在需要你做个遥控器控制所有家电的开关,要求做到每个按钮对应的功能供用户个性化,对于新买入家电要

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

原文:C#设计模式(15)--命令模式(Command Pattern) 一.前言 之前一直在忙于工作上的事情,关于设计模式系列一直没更新,最近项目中发现,对于设计模式的了解是必不可少的,当然对于设计模式的应用那更是重要,可以说是否懂得应用设计模式在项目中是衡量一个程序员的技术水平,因为对于一个功能的实现,高级工程师和初级工程师一样都会实现,但是区别在于它们实现功能的可扩展和可维护性,也就是代码的是否“优美”.可读.但是,要更好地应用,首先就必须了解各种设计模式和其应用场景,所以我还是希望继续完

【16】命令模式(Command Pattern)

一.前言 最近项目中发现,对于设计模式的了解是必不可少的,当然对于设计模式的应用那更是重要,可以说是否懂得应用设计模式在项目中是衡量一个程序员的技术水平,因为对于一个功能的实现,高级工程师和初级工程师一样都会实现,但是区别在于它们实现功能的可扩展和可维护性,也就是代码的是否"优美".可读.但是,要更好地应用,首先就必须了解各种设计模式和其应用场景,所以我还是希望继续完成设计模式这个系列,希望通过这种总结的方式来加深自己设计模式的理解. 二.命令模式的介绍 2.1 命令模式的定义 命令模

设计模式:命令模式(Command)

在开发过程中,我可能会需要向某些对象发送一些请求,但是我们不知请求的具体接收者是谁,也不知道被请求的操作是那个,我们只知道在程序运行中指定具体的请求接收者即可.打个比方,电视遥控器,我们只需要知道按那个按钮能够打开电视.关闭电视和换台即可,并不需要知道是怎么开电视.关电视和换台的.对于这种情况,我们可以采用命令模式来进行设计. 一.基本定义 命令模式将请求封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式支持可撤销的操作. 命令模式可以对发送者额接受者完全解耦,发送者也接收者

蛋疼的命令模式。(转)

还是简单的记录一下自己的理解.命令模式下,invoker于最后提供实现的对象receiver没有直接接触. invoker执行一个命令(方法),方法就是执行command对象里面的方法,该command对象里面包含了receiver对象. invoker就执行了一个命令,后面的具体逻辑可以交给command里面去执行,所有每一个commmand如果需要不同的操作,需要继承不同的Com对象. Fluent Python一书中可以将函数当做对象传入com对象里面传入函数,让里面的函数去执行各个不同的

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

基本概念: Command模式也叫命令模式 ,是行为设计模式的一种.Command模式通过被称为Command的类封装了对目标对象的调用行为以及调用参数,命令模式将方法调用给封装起来了. 命令模式的几个角色: Command: 抽象命令类 ConcreteCommand: 具体命令类 Invoker: 调用者 Receiver: 接收者 Client:客户类 命令模式的优缺点: 优点 1. 降低了系统耦合度 2. 新的命令可以很容易添加到系统中去. 缺点 使用命令模式可能会导致某些系统有过多的具