(十三)WebGIS中工具欄的設計之命令模式


文章版權由作者李曉暉和博客園共有,若轉載請於明顯處標明出處: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/

                                                                           如果您覺得本文確實幫助了您,可以微信掃一掃,進行小額的打賞和鼓勵,謝謝 ^_^

                                      


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM