孟婷婷 何利力
摘要:該文探討了觀察者(Observer)設計模式的概念及在手機導航軟件中的應用。通過實例證明了該模式下導航軟件的性能得到了進一步的提升,提供了實現(xiàn)手機導航的Java程序代碼,并總結(jié)該模式在軟件設計過程中的優(yōu)點。
關鍵詞: Observer設計模式;軟件開發(fā);手機導航
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2014)19-4579-04
Observer Design Pattern Used in Navigation Software
MENG Ting-ting, HE Li-li
(Information College of Zhejiang University, Hangzhou 310018,China)
Abstract: This paper discusses the observer(觀察者) design pattern concept and the pattern in the mobile phone navigation software. Examples show that the performance of the model system has been further improved, this paper provides a mobile phone navigation Java code, and summarizes the advantages of the model in the software design process.
Key words: Observer design pattern; software development; mobile navigation
目前,隨著經(jīng)濟社會的發(fā)展,人們生活水平的提高,商務談判、旅游、異地探親等變得更加頻繁,手機導航軟件在其中發(fā)揮著舉足輕重的作用。手機導航軟件,在把用戶從出發(fā)地帶到目的地的過程中,通過GPS實時獲取用戶在地圖中所在的位置,以及目的地在地圖中的位置。在手機導航軟件的開發(fā)中,觀察者設計模式能夠使系統(tǒng)易于維護、擴展和復用。該文主要討論的是該模式在手機導航軟件中的應用,并總結(jié)該模式在軟件設計過程中的優(yōu)點。
1 觀察者設計模式概述
啟動導航,進行導航,結(jié)束導航這些過程中往往要求在位置信息發(fā)生變化的時候,用戶交互端能夠準確快捷地做出相應的改變以便于用戶做出選擇。對于實現(xiàn)這一點的設計方案有很多,但是用于復雜的導航軟件中,例如景區(qū)內(nèi)外的多個導航相結(jié)合的系統(tǒng),我們就必須采用易于復用,低耦合度的設計模式。減少對象之間的耦合有利于軟件的復用,但同時設計者需要使這些低耦合度的對象之間能夠保持行動一致的協(xié)調(diào)性,保證對象間高度的協(xié)作。觀察者設計模式是行為模式的典型代表,它正符合上述的要求。
2 觀察者設計模式剖析
觀察者設計模式定義了一種一對多的依賴關系,讓多個觀察者對象同時監(jiān)聽某一個主題對象。這個主題對象在狀態(tài)上發(fā)生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。觀察者模式(Observer)完美地將觀察者和被觀察的對象分離開。例如Android用戶界面可以作為一個觀察者,GPS位置信息是被觀察者,用戶界面觀察位置信息的變化,發(fā)現(xiàn)數(shù)據(jù)變化后,就相應地調(diào)整導航信息并顯示在用戶界面上或者進行語音提示。
面向?qū)ο笤O計的一個原則是:系統(tǒng)中的每個類將重點放在某一個功能上,而不是其他方面。一個對象只做一件事情,并且將他做好。觀察者設計模式在模塊之間劃定了清晰的界限,提高了應用程序的可維護性和重用性。實現(xiàn)方式首先是觀察者在被觀察者那兒注冊,然后被觀察者發(fā)生變化后,向每一個在他那兒注冊的觀察者發(fā)送消息,通知他們進行數(shù)據(jù)修改。在手機導航軟件中,只要位置信息發(fā)生了改變,導航信息以及地圖顯示信息都要做相應的變換。
3 手機導航軟件中觀察者設計模式的應用
GPS位置信息是一個被觀察者,地圖顯示是一個觀察者,導航信息也是一個觀察者,他們都向位置信息做了相應注冊,當前位置發(fā)生變化,地圖顯示收到更新,將新的位置信息展示到地圖上,導航信息收到更新,調(diào)用相應的導航算法去判斷當前的一些導航信息(轉(zhuǎn)向距離,轉(zhuǎn)向方位,是否偏航等)來進行頁面的展示和用戶的交互,如圖1。
3.1 定義觀察者接口
//定義位置觀察者接口,聲明位置變化的更新函數(shù),當位置發(fā)生了變化(精度,海拔, //經(jīng)度,緯度,速度,方向等),自動調(diào)用位置更新函數(shù)。
public interface LocationObserver {
void locationDataChanged(Location location);
}
3.2 定義具體的觀察者
在導航應用中定義具體觀察者,當數(shù)據(jù)發(fā)生變化,前臺頁面相應的進行修改或者數(shù)據(jù)變換,改變導航信息來與用戶進行交互,語音提示。
例如:剛進入系統(tǒng)的時候未獲取到位置信息,將顯示默認地圖,定位觀察者將等待位置信息,當捕獲了GPS之后通知所有的觀察者,定位觀察者收到通知后,首先將地圖的中心位置設置為當前位置,然后在地圖中畫出當前位置,展示給用戶,如圖2所示(圓圈代表定位精度);在路徑規(guī)劃的過程中,線路觀察者收到位置變化的通知后,通過計算來判斷是否偏航,是否需要重新規(guī)劃線路,如圖3所示,用戶可以通過關鍵詞搜索或者地圖點選來確定目的地的位置信息,然后進行路徑規(guī)劃和引導。
圖2 定位觀察者 圖3 線路觀察者
public class GpsLocationObserver extends Activity implements LocationObserver {
private GpsLocationSubject gpsLS = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_item);
initViews();// 初始化頁面控件
gpsLS = GpsLocationSubject.getGpsLS();
gpsLS.register(this); // 將此頁面注冊到觀察者列表中去
}
@Override
protected void onPause() {
super.onPause();
gpsLS.unRegister(this); // 界面不可見時將其從列表中移除
}
@Override
public void locationDataChanged(Location location) {
// 觀察者得到目標改變而傳過來的位置信息,進行導航操作
gotoNav(location);
}
private void initViews() {…}
private void gotoNav(Location location) {…}
}
3.3 定義抽象主題
定義一個抽象(abstract)的位置主題,并且定義一個位置觀察者的列表,用來存放觀察位置變化的所有的位置觀察者obs,由于obs可能同時被多個觀察者調(diào)用,例如:地圖繪制我的位置的觀察者調(diào)用的同時可能根據(jù)位置進行導航計算的觀察者也在進行中,為了造成沖突,為obs加鎖,不管哪一個線程(例如線程A),運行到這個方法時,都要檢查有沒有其它線程B(或者C、 D等)正在用這個方法,有的話要等正在使用synchronized方法的線程B(或者C 、D)運行完這個方法后再運行此線程A;沒有的話,直接運行。
public abstract class LocationSubject {
protected List
// 注冊添加觀察者
public synchronized void register(LocationObserver observer) {
if(obs!=null&&!obs.contains(observer)){
obs.add(observer); }
};
// 解除移除觀察者
public synchronized void unRegister(LocationObserver observer) {
if (obs != null && obs.contains(observer)) {
obs.remove(observer);
}};
}
3.4 定義具體主題
定義了一個具體的觀察者,此觀察者實現(xiàn)了安卓自己的位置獲取的接口,當位置發(fā)生變化的時候,通知觀察者進行位置更新,遍歷每一個觀察者發(fā)出位置變化的消息。
public class GpsLocationSubject extends LocationSubject implements LocationListener
{private static GpsLocationSubject subject = null;
private GpsLocationSubject() {
obs = new LinkedList
}
//保證當前為唯一的
public static GpsLocationSubject getGpsLS() {
if (subject == null) {
subject = new GpsLocationSubject();
}
return subject;
}
//得到手機設備gps的位置信息將位置信息通知給每個已經(jīng)注冊的觀察者
@Override
public void onLocationChanged(Location location) {
for (LocationObserver subject : obs) {
subject.locationDataChanged(location);
}}
//關閉了位置提供者
@Override
public void onProviderDisabled(String provider) {…}
//打開了位置提供者
@Override
public void onProviderEnabled(String provider) {…}
//位置提供者狀態(tài)發(fā)生變化
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {…}
}
3.5 觀察者模式的實踐
將這一設計模式應用于導航實踐中,可以發(fā)現(xiàn)軟件的復用性得到了很大的提高,不過每種模式都有再進步的空間,在手機導航軟件中的應用觀察者模式只是小試牛刀,后續(xù)的研究完善才是更重要的探索。此系統(tǒng)中完成了實時位置的獲取,最佳駕車方案的路徑規(guī)劃以及完善的導航架構(gòu),做到了一鍵生成路徑,一鍵引導,方便了廣大用戶,在各個模塊中都要根據(jù)位置信息來確定界面布局或者進行相應的計算,所以位置的實時性很重要。如圖4,只要位置信息發(fā)生了變化,影響導航的情況下(地圖中當前位置,也就是起點與實際位置相差較大,無法使用當前的路徑進行導航)需要計算新的位置到目的地的路徑,并將地圖中的路徑進行相應的更新。如圖5,只要位置信息變化了,手機導航界面的轉(zhuǎn)向信息,轉(zhuǎn)向距離信息,目的地距離信息,下一道路信息,當前道路信息,輔助導航信息都要進行一次刷新。
圖4 路徑規(guī)劃 圖5 導航觀察者
4 結(jié)果分析
實踐出真知,觀察者設計模式給手機導航軟件的設計應用帶來極大的方便。當數(shù)據(jù)發(fā)生變化時,相關觀察者的數(shù)據(jù)自動更新,真正體現(xiàn)了自動實時化優(yōu)點。通過利用觀察者設計模式,不僅可以避免大量的重復動作,還提高了軟件的可擴展性、可移植性以及程序的可健壯性,真正地達到了軟件的復用。此外,觀察者設計模式在手機導航軟件中低耦合的作用極為突出。不過,觀察者模式在手機導航軟件中的應用有待進一步的探索和研究。
參考文獻:
[1] 張寧,王越,王東. 觀察者模式及其在軟件開發(fā)中的應用[J].大眾科技,2008,11:35-36.
[2] 歐陽宏基,楊衛(wèi)忠,趙薔. 觀察者模式在Java事件處理中的應用研究[J].微處理機,2013,4:77-79.
[3] 張德靜. observer模式研究及實現(xiàn)[D].成都:電子科技大學,2005.
[4] 梁曉明.智能手機導航軟件界面用戶體驗研究[D].無錫:江南大學,2013.
[5] 馬越. Android的架構(gòu)與應用[D].北京:中國地質(zhì)大學,2008.
[6] 黃一青.UML在面向?qū)ο蟪绦蛟O計中的應用[J]. 計算機與現(xiàn)代化,2008,2:67-69.
@Override
public void onProviderEnabled(String provider) {…}
//位置提供者狀態(tài)發(fā)生變化
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {…}
}
3.5 觀察者模式的實踐
將這一設計模式應用于導航實踐中,可以發(fā)現(xiàn)軟件的復用性得到了很大的提高,不過每種模式都有再進步的空間,在手機導航軟件中的應用觀察者模式只是小試牛刀,后續(xù)的研究完善才是更重要的探索。此系統(tǒng)中完成了實時位置的獲取,最佳駕車方案的路徑規(guī)劃以及完善的導航架構(gòu),做到了一鍵生成路徑,一鍵引導,方便了廣大用戶,在各個模塊中都要根據(jù)位置信息來確定界面布局或者進行相應的計算,所以位置的實時性很重要。如圖4,只要位置信息發(fā)生了變化,影響導航的情況下(地圖中當前位置,也就是起點與實際位置相差較大,無法使用當前的路徑進行導航)需要計算新的位置到目的地的路徑,并將地圖中的路徑進行相應的更新。如圖5,只要位置信息變化了,手機導航界面的轉(zhuǎn)向信息,轉(zhuǎn)向距離信息,目的地距離信息,下一道路信息,當前道路信息,輔助導航信息都要進行一次刷新。
圖4 路徑規(guī)劃 圖5 導航觀察者
4 結(jié)果分析
實踐出真知,觀察者設計模式給手機導航軟件的設計應用帶來極大的方便。當數(shù)據(jù)發(fā)生變化時,相關觀察者的數(shù)據(jù)自動更新,真正體現(xiàn)了自動實時化優(yōu)點。通過利用觀察者設計模式,不僅可以避免大量的重復動作,還提高了軟件的可擴展性、可移植性以及程序的可健壯性,真正地達到了軟件的復用。此外,觀察者設計模式在手機導航軟件中低耦合的作用極為突出。不過,觀察者模式在手機導航軟件中的應用有待進一步的探索和研究。
參考文獻:
[1] 張寧,王越,王東. 觀察者模式及其在軟件開發(fā)中的應用[J].大眾科技,2008,11:35-36.
[2] 歐陽宏基,楊衛(wèi)忠,趙薔. 觀察者模式在Java事件處理中的應用研究[J].微處理機,2013,4:77-79.
[3] 張德靜. observer模式研究及實現(xiàn)[D].成都:電子科技大學,2005.
[4] 梁曉明.智能手機導航軟件界面用戶體驗研究[D].無錫:江南大學,2013.
[5] 馬越. Android的架構(gòu)與應用[D].北京:中國地質(zhì)大學,2008.
[6] 黃一青.UML在面向?qū)ο蟪绦蛟O計中的應用[J]. 計算機與現(xiàn)代化,2008,2:67-69.
@Override
public void onProviderEnabled(String provider) {…}
//位置提供者狀態(tài)發(fā)生變化
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {…}
}
3.5 觀察者模式的實踐
將這一設計模式應用于導航實踐中,可以發(fā)現(xiàn)軟件的復用性得到了很大的提高,不過每種模式都有再進步的空間,在手機導航軟件中的應用觀察者模式只是小試牛刀,后續(xù)的研究完善才是更重要的探索。此系統(tǒng)中完成了實時位置的獲取,最佳駕車方案的路徑規(guī)劃以及完善的導航架構(gòu),做到了一鍵生成路徑,一鍵引導,方便了廣大用戶,在各個模塊中都要根據(jù)位置信息來確定界面布局或者進行相應的計算,所以位置的實時性很重要。如圖4,只要位置信息發(fā)生了變化,影響導航的情況下(地圖中當前位置,也就是起點與實際位置相差較大,無法使用當前的路徑進行導航)需要計算新的位置到目的地的路徑,并將地圖中的路徑進行相應的更新。如圖5,只要位置信息變化了,手機導航界面的轉(zhuǎn)向信息,轉(zhuǎn)向距離信息,目的地距離信息,下一道路信息,當前道路信息,輔助導航信息都要進行一次刷新。
圖4 路徑規(guī)劃 圖5 導航觀察者
4 結(jié)果分析
實踐出真知,觀察者設計模式給手機導航軟件的設計應用帶來極大的方便。當數(shù)據(jù)發(fā)生變化時,相關觀察者的數(shù)據(jù)自動更新,真正體現(xiàn)了自動實時化優(yōu)點。通過利用觀察者設計模式,不僅可以避免大量的重復動作,還提高了軟件的可擴展性、可移植性以及程序的可健壯性,真正地達到了軟件的復用。此外,觀察者設計模式在手機導航軟件中低耦合的作用極為突出。不過,觀察者模式在手機導航軟件中的應用有待進一步的探索和研究。
參考文獻:
[1] 張寧,王越,王東. 觀察者模式及其在軟件開發(fā)中的應用[J].大眾科技,2008,11:35-36.
[2] 歐陽宏基,楊衛(wèi)忠,趙薔. 觀察者模式在Java事件處理中的應用研究[J].微處理機,2013,4:77-79.
[3] 張德靜. observer模式研究及實現(xiàn)[D].成都:電子科技大學,2005.
[4] 梁曉明.智能手機導航軟件界面用戶體驗研究[D].無錫:江南大學,2013.
[5] 馬越. Android的架構(gòu)與應用[D].北京:中國地質(zhì)大學,2008.
[6] 黃一青.UML在面向?qū)ο蟪绦蛟O計中的應用[J]. 計算機與現(xiàn)代化,2008,2:67-69.