文章版權由作者李曉暉和博客園共有,若轉載請於明顯處標明出處: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/
如果您覺得本文確實幫助了您,可以微信掃一掃,進行小額的打賞和鼓勵,謝謝 ^_^

