Observer设计模式在手机导航软件中的应用

2014-08-14 05:23孟婷婷何利力
电脑知识与技术 2014年19期
关键词:设计模式观察者飞翔

孟婷婷 何利力

摘要:该文探讨了观察者(Observer)设计模式的概念及在手机导航软件中的应用。通过实例证明了该模式下导航软件的性能得到了进一步的提升,提供了实现手机导航的Java程序代码,并总结该模式在软件设计过程中的优点。

关键词: Observer设计模式;软件开发;手机导航

中图分类号: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

目前,随着经济社会的发展,人们生活水平的提高,商务谈判、旅游、异地探亲等变得更加频繁,手机导航软件在其中发挥着举足轻重的作用。手机导航软件,在把用户从出发地带到目的地的过程中,通过GPS实时获取用户在地图中所在的位置,以及目的地在地图中的位置。在手机导航软件的开发中,观察者设计模式能够使系统易于维护、扩展和复用。该文主要讨论的是该模式在手机导航软件中的应用,并总结该模式在软件设计过程中的优点。

1 观察者设计模式概述

启动导航,进行导航,结束导航这些过程中往往要求在位置信息发生变化的时候,用户交互端能够准确快捷地做出相应的改变以便于用户做出选择。对于实现这一点的设计方案有很多,但是用于复杂的导航软件中,例如景区内外的多个导航相结合的系统,我们就必须采用易于复用,低耦合度的设计模式。减少对象之间的耦合有利于软件的复用,但同时设计者需要使这些低耦合度的对象之间能够保持行动一致的协调性,保证对象间高度的协作。观察者设计模式是行为模式的典型代表,它正符合上述的要求。

2 观察者设计模式剖析

观察者设计模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。观察者模式(Observer)完美地将观察者和被观察的对象分离开。例如Android用户界面可以作为一个观察者,GPS位置信息是被观察者,用户界面观察位置信息的变化,发现数据变化后,就相应地调整导航信息并显示在用户界面上或者进行语音提示。

面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者设计模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。实现方式首先是观察者在被观察者那儿注册,然后被观察者发生变化后,向每一个在他那儿注册的观察者发送消息,通知他们进行数据修改。在手机导航软件中,只要位置信息发生了改变,导航信息以及地图显示信息都要做相应的变换。

3 手机导航软件中观察者设计模式的应用

GPS位置信息是一个被观察者,地图显示是一个观察者,导航信息也是一个观察者,他们都向位置信息做了相应注册,当前位置发生变化,地图显示收到更新,将新的位置信息展示到地图上,导航信息收到更新,调用相应的导航算法去判断当前的一些导航信息(转向距离,转向方位,是否偏航等)来进行页面的展示和用户的交互,如图1。

3.1 定义观察者接口

//定义位置观察者接口,声明位置变化的更新函数,当位置发生了变化(精度,海拔, //经度,纬度,速度,方向等),自动调用位置更新函数。

public interface LocationObserver {

void locationDataChanged(Location location);

}

3.2 定义具体的观察者

在导航应用中定义具体观察者,当数据发生变化,前台页面相应的进行修改或者数据变换,改变导航信息来与用户进行交互,语音提示。

例如:刚进入系统的时候未获取到位置信息,将显示默认地图,定位观察者将等待位置信息,当捕获了GPS之后通知所有的观察者,定位观察者收到通知后,首先将地图的中心位置设置为当前位置,然后在地图中画出当前位置,展示给用户,如图2所示(圆圈代表定位精度);在路径规划的过程中,线路观察者收到位置变化的通知后,通过计算来判断是否偏航,是否需要重新规划线路,如图3所示,用户可以通过关键词搜索或者地图点选来确定目的地的位置信息,然后进行路径规划和引导。

图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可能同时被多个观察者调用,例如:地图绘制我的位置的观察者调用的同时可能根据位置进行导航计算的观察者也在进行中,为了造成冲突,为obs加锁,不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程B(或者C、 D等)正在用这个方法,有的话要等正在使用synchronized方法的线程B(或者C 、D)运行完这个方法后再运行此线程A;没有的话,直接运行。

public abstract class LocationSubject {

protected List obs = null;

// 注册添加观察者

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 定义具体主题

定义了一个具体的观察者,此观察者实现了安卓自己的位置获取的接口,当位置发生变化的时候,通知观察者进行位置更新,遍历每一个观察者发出位置变化的消息。

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的位置信息将位置信息通知给每个已经注册的观察者

@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) {…}

//位置提供者状态发生变化

@Override

public void onStatusChanged(String provider, int status, Bundle extras) {…}

}

3.5 观察者模式的实践

将这一设计模式应用于导航实践中,可以发现软件的复用性得到了很大的提高,不过每种模式都有再进步的空间,在手机导航软件中的应用观察者模式只是小试牛刀,后续的研究完善才是更重要的探索。此系统中完成了实时位置的获取,最佳驾车方案的路径规划以及完善的导航架构,做到了一键生成路径,一键引导,方便了广大用户,在各个模块中都要根据位置信息来确定界面布局或者进行相应的计算,所以位置的实时性很重要。如图4,只要位置信息发生了变化,影响导航的情况下(地图中当前位置,也就是起点与实际位置相差较大,无法使用当前的路径进行导航)需要计算新的位置到目的地的路径,并将地图中的路径进行相应的更新。如图5,只要位置信息变化了,手机导航界面的转向信息,转向距离信息,目的地距离信息,下一道路信息,当前道路信息,辅助导航信息都要进行一次刷新。

图4 路径规划 图5 导航观察者

4 结果分析

实践出真知,观察者设计模式给手机导航软件的设计应用带来极大的方便。当数据发生变化时,相关观察者的数据自动更新,真正体现了自动实时化优点。通过利用观察者设计模式,不仅可以避免大量的重复动作,还提高了软件的可扩展性、可移植性以及程序的可健壮性,真正地达到了软件的复用。此外,观察者设计模式在手机导航软件中低耦合的作用极为突出。不过,观察者模式在手机导航软件中的应用有待进一步的探索和研究。

参考文献:

[1] 张宁,王越,王东. 观察者模式及其在软件开发中的应用[J].大众科技,2008,11:35-36.

[2] 欧阳宏基,杨卫忠,赵蔷. 观察者模式在Java事件处理中的应用研究[J].微处理机,2013,4:77-79.

[3] 张德静. observer模式研究及实现[D].成都:电子科技大学,2005.

[4] 梁晓明.智能手机导航软件界面用户体验研究[D].无锡:江南大学,2013.

[5] 马越. Android的架构与应用[D].北京:中国地质大学,2008.

[6] 黄一青.UML在面向对象程序设计中的应用[J]. 计算机与现代化,2008,2:67-69.

@Override

public void onProviderEnabled(String provider) {…}

//位置提供者状态发生变化

@Override

public void onStatusChanged(String provider, int status, Bundle extras) {…}

}

3.5 观察者模式的实践

将这一设计模式应用于导航实践中,可以发现软件的复用性得到了很大的提高,不过每种模式都有再进步的空间,在手机导航软件中的应用观察者模式只是小试牛刀,后续的研究完善才是更重要的探索。此系统中完成了实时位置的获取,最佳驾车方案的路径规划以及完善的导航架构,做到了一键生成路径,一键引导,方便了广大用户,在各个模块中都要根据位置信息来确定界面布局或者进行相应的计算,所以位置的实时性很重要。如图4,只要位置信息发生了变化,影响导航的情况下(地图中当前位置,也就是起点与实际位置相差较大,无法使用当前的路径进行导航)需要计算新的位置到目的地的路径,并将地图中的路径进行相应的更新。如图5,只要位置信息变化了,手机导航界面的转向信息,转向距离信息,目的地距离信息,下一道路信息,当前道路信息,辅助导航信息都要进行一次刷新。

图4 路径规划 图5 导航观察者

4 结果分析

实践出真知,观察者设计模式给手机导航软件的设计应用带来极大的方便。当数据发生变化时,相关观察者的数据自动更新,真正体现了自动实时化优点。通过利用观察者设计模式,不仅可以避免大量的重复动作,还提高了软件的可扩展性、可移植性以及程序的可健壮性,真正地达到了软件的复用。此外,观察者设计模式在手机导航软件中低耦合的作用极为突出。不过,观察者模式在手机导航软件中的应用有待进一步的探索和研究。

参考文献:

[1] 张宁,王越,王东. 观察者模式及其在软件开发中的应用[J].大众科技,2008,11:35-36.

[2] 欧阳宏基,杨卫忠,赵蔷. 观察者模式在Java事件处理中的应用研究[J].微处理机,2013,4:77-79.

[3] 张德静. observer模式研究及实现[D].成都:电子科技大学,2005.

[4] 梁晓明.智能手机导航软件界面用户体验研究[D].无锡:江南大学,2013.

[5] 马越. Android的架构与应用[D].北京:中国地质大学,2008.

[6] 黄一青.UML在面向对象程序设计中的应用[J]. 计算机与现代化,2008,2:67-69.

@Override

public void onProviderEnabled(String provider) {…}

//位置提供者状态发生变化

@Override

public void onStatusChanged(String provider, int status, Bundle extras) {…}

}

3.5 观察者模式的实践

将这一设计模式应用于导航实践中,可以发现软件的复用性得到了很大的提高,不过每种模式都有再进步的空间,在手机导航软件中的应用观察者模式只是小试牛刀,后续的研究完善才是更重要的探索。此系统中完成了实时位置的获取,最佳驾车方案的路径规划以及完善的导航架构,做到了一键生成路径,一键引导,方便了广大用户,在各个模块中都要根据位置信息来确定界面布局或者进行相应的计算,所以位置的实时性很重要。如图4,只要位置信息发生了变化,影响导航的情况下(地图中当前位置,也就是起点与实际位置相差较大,无法使用当前的路径进行导航)需要计算新的位置到目的地的路径,并将地图中的路径进行相应的更新。如图5,只要位置信息变化了,手机导航界面的转向信息,转向距离信息,目的地距离信息,下一道路信息,当前道路信息,辅助导航信息都要进行一次刷新。

图4 路径规划 图5 导航观察者

4 结果分析

实践出真知,观察者设计模式给手机导航软件的设计应用带来极大的方便。当数据发生变化时,相关观察者的数据自动更新,真正体现了自动实时化优点。通过利用观察者设计模式,不仅可以避免大量的重复动作,还提高了软件的可扩展性、可移植性以及程序的可健壮性,真正地达到了软件的复用。此外,观察者设计模式在手机导航软件中低耦合的作用极为突出。不过,观察者模式在手机导航软件中的应用有待进一步的探索和研究。

参考文献:

[1] 张宁,王越,王东. 观察者模式及其在软件开发中的应用[J].大众科技,2008,11:35-36.

[2] 欧阳宏基,杨卫忠,赵蔷. 观察者模式在Java事件处理中的应用研究[J].微处理机,2013,4:77-79.

[3] 张德静. observer模式研究及实现[D].成都:电子科技大学,2005.

[4] 梁晓明.智能手机导航软件界面用户体验研究[D].无锡:江南大学,2013.

[5] 马越. Android的架构与应用[D].北京:中国地质大学,2008.

[6] 黄一青.UML在面向对象程序设计中的应用[J]. 计算机与现代化,2008,2:67-69.

猜你喜欢
设计模式观察者飞翔
观察者
仿生设计模式的创新应用探索
“1+1”作业设计模式的实践探索
飞翔吧,少年!
飞翔(上)
冷静而又理性的观察者——德国华人作家刘瑛访谈
交通机电工程设计模式创新探讨
独自前行 迎风飞翔
好梦飞翔
互动式设计模式研究