`
forhope
  • 浏览: 367112 次
  • 性别: Icon_minigender_1
  • 来自: 帝都
社区版块
存档分类
最新评论

Android开发:观察者模式应用实例

阅读更多
观察者模式应用实例——Broadercast实现进程间异步通信

1 Broadcast实现进程通信

利用Broadcast可以实现Android中的进程间通信。

比如,存在客户端BCClient和服务端BCService这两个不同的进程,它们之间的通信过程具体如下图所示:


  通过这样的方式双方能完成通信,不过要达到异步通信的目的,需要进一步改进设计。

2实现异步通信
       为了实现异步通信,需要对客户端的类进行重新设计,同时考虑到系统的扩展性、可复用性,以及服务端对外接口的易用性。选择将BCClient的视图ClientActivity剥离出去,并对ClientReceiver做进一步封装,相当于在原客户端和服务端中间构建出一层作为中间层。



为了便于说明,客户端和服务端需要一个应用场景。假设服务端负责管理系统相关设备,并提供操作设备的接口,而客户端则根据需求通过中间件来异步调用相应的服务。

比如,用户点击客户端的按钮来获取设备信息,并且点击按钮后用户不必一直等待服务端返回信息才能继续操作,而是服务端响应完成后自动通知客户端。

       由于整个过程客户端不是进行同步等待,而是异步接收,设计时考虑引入设计模式中的“观察者模式”。

2.1 观察者模式     
       通过以上分析,明确了设计的改进重点在于对ClientReceiver的封装,并且封装采取的合理策略应当是 “观察者模式”。改进设计后ClientReceiver就被中间层所替代,中间层的类图如下:



  从类图中不难看出,这是一个典型的“观察者模式”的类设计模型,DevListener对应于观察者模式中的观察者“Observer”,而DevManager就是观察者模式中的主题“Subject”。原ClientReceiver的主要功能被封装在中间层的DevReceiver类中,而服务端接口的直接调用者是DevManager类。

2.2 客户端服务端交互流程
       在加入“观察者模式”后,客户端和服务端的交互流程如下:

1、客户端-->创建监听器-->在监听器中重写回调函数,用于处理服务端返回结果-->将该监听器注册到DevManager -->调用DevManager 的readDevInfo方法向服务端发送广播;

2、服务端-->利用BroadcastReceiver接受到广播信息-->处理信息-->向客户端(DevReceiver)发送广播信息;

3、客户端-->利用BroadcastReceiver(DevReceiver)接受到广播信息-->调用DevManager的notifyListener方法-->调用客户端重写好的回调函数,完成异步通信。

2.3 客户端调用
       加入中间层后,客户端能够方便的使用DevManager提供的服务,在使用DevManager提供的服务时如同使用Button控件一样(Button控件的内部实现也是利用了观察者模式)方便、简洁。



客户端调用代码如下:

public class ClientActivity extends Activity {

    private static final String TAG = "ClientActivity>>>>>>>>>";

    private DevManager dm;

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        Log.i(TAG,"onCreate");

        Button button = (Button)findViewById(R.id.button);    

        button.setOnClickListener(new BroadcastListener());  

              dm = DevManager.getInstance();                    

              dm.setDevListener(new DevListener(){

                     @Override

                     public void dealWith(DevEvent event) {

Toast.makeText(getApplicationContext(),event.getEventContent(), 10000).show(); 

                     }                  

              });

    }

       class BroadcastListener implements OnClickListener{

              @Override

              public void onClick(View view) {

                     Log.i(TAG, "Click SendButton"); 

                     dm.readDevInfo(view.getContext());

              }     

    }

}


       客户端的调用服务过程主要是通过DevManager对监听器DevListener进行注册、监听。运行结果如下,当点击“send”按钮的时候发送设备读取请求,即调用readDevInfo方法,点击完成后不必等待服务端的相应。

服务端处理完客户端请求后,会向中间层的DevReceiver发送广播,DevReceiver接到广播后回调客户端重载的dealWith函数,部分代码如下:

public void onReceive(Context context, Intent intent) {

              if(intent.getAction().equals("DoServiceResponse")){

                Log.i(TAG,"Action Is DoServiceResponse");

            Communication info = (Communication)intent.getParcelableExtra("ResponseInfo");

          if(info != null){

                 Log.i(TAG,"Receive ResponseInfo");

              DevEvent event = new DevEvent();

              event.setEventContent(info.getContent());

              DevManager.getInstance().notifyListener(event); 

          }

}

//notifyListener的实现如下:

public void notifyListener(DevEvent event){

              if(listener == null){

                     return;

              }

              else{

                     Log.i(TAG, "Notify Listener");

                     listener.dealWith(event);

              }

}


回调完成后,客户端获取到服务端信息:

3 小结
       观察者模式的核心思想是将数据表示层和逻辑层分离,并定义了稳定的消息传递机制、抽象出调用接口。在需要采用异步通信的应用场景中,合理地运用观察者模式往往会有很好的效果。

       当然观察者模式也存在有缺陷。目前本例中的Observer(即本例中的DevListener)只有一个,如果一个Subject(即本例中的DevManager)中注册有大量Observer(即DevManager中存在一个存放DevListener的集合)的话,在广播通知Observer时存在效率问题,毕竟需要遍历集合中所有的Observer。


原文链接:http://www.linuxidc.com/Linux/2011-09/42585.htm
分享到:
评论
1 楼 qinwei_2014 2014-10-15  
  [b][
引用
[u][i][/i][/u]
/b]

相关推荐

    Android 设计模式学习之观察者模式应用实例

    本文将深入探讨一种常用的设计模式——观察者模式(Observer Pattern),并结合Android实际应用给出实例解析。 观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,...

    android Observer(观察者模式)_案例祥解.pdf

    观察者模式详解 观察者模式是23种设计模式中的一种,尤其是在软件设计过程中体现的更是立足...观察者模式是一种常用的设计模式,广泛应用于软件开发中。本文详细讲解了观察者模式的概念和实现,希望对读者有所帮助。

    Android观察者模式实例分析

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在Android开发中,这种模式被广泛用于构建可扩展和灵活的系统,例如事件...

    设计模式 观察者模式 以Android中TextView文本内容发生变化为背景

    通过这个以TextView为例的观察者模式应用,我们可以看到设计模式在实际开发中的重要性,它可以帮助我们编写更灵活、可复用的代码,提高代码的可维护性和可读性。在学习和使用设计模式的过程中,我们应该结合实际场景...

    观察者模式示例代码 android studio kotlin代码 基于java.uitl.*

    这个例子展示了如何在Android项目中使用Kotlin和`java.util.*`包中的观察者模式,虽然在现代Android开发中,我们更倾向于使用Kotlin的协程和LiveData等工具来实现异步通信和事件处理,但理解基本的观察者模式对于...

    观察者模式for android demo

    6. **回调函数**:在Android开发中,我们也经常使用回调函数来实现观察者模式,例如OnClickListener、OnCheckedChangeListener等,这些都是观察者模式的实例。 7. **订阅与退订**:为了防止内存泄漏,观察者在不再...

    android观察者模式:EventBus实现GPS定位

    在Android开发中,观察者模式(Observer Pattern)是一种常见的设计模式,它允许对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。EventBus是一款轻量级的事件总线...

    Android源码中观察者模式的运用.pdf

    在Android系统中,这种模式被广泛应用于数据变更的通知机制,例如ListView的Adapter就是典型的观察者模式应用场景。 在观察者模式中,存在四个主要的角色: 1. 抽象主题(Subject):这是被观察的对象,通常包含一...

    Android监听——回调模式与观察者模式

    在Android中,最常见的观察者模式应用是BroadcastReceiver(广播接收器)。BroadcastReceiver可以监听系统或者自定义的广播事件,当特定的广播事件发生时,BroadcastReceiver的onReceive()方法会被调用,开发者在...

    基于观察者模式两个activity通信

    通过定义自定义的`Observer`和`Observable`,我们可以轻松地在Android应用中实现Activity间的通信,特别是在涉及到多个活动参与的数据流更新时,观察者模式能大大简化代码结构,提高可维护性。在Test文件中,可能...

    android观察者模式Demo

    在Android开发中,观察者模式(Observer Pattern)是一种常见的设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。在这个"android观察者模式...

    Android编程设计模式之观察者模式实例详解

    Android 编程设计模式之观察者模式实例详解 Android 编程设计模式之观察者模式是 Android 开发中的一种重要设计模式,主要用于解决 GUI 系统和订阅——发布系统中的问题。观察者模式可以将被观察者和观察者解耦,...

    观察者模式(Observer)

    在实际开发中,很多框架和库也内置了观察者模式,如JavaScript中的EventEmitter(Node.js)、C#的事件和委托,以及Android中的BroadcastReceiver等。这些工具使得开发者可以更便捷地应用观察者模式,提高代码的可...

    利用观察者模式(发布/订阅模式)制作一个“代替”广播的通知类

    观察者模式,也被称为发布/订阅模式,是软件设计模式中的一个重要概念,它在很多场景下用于实现对象之间的通信和事件处理。...在实际开发中,观察者模式广泛应用于事件驱动编程、GUI组件通信、状态管理等领域。

    观察者模式

    在Android开发中,观察者模式的实例包括: - **BroadcastReceiver**:系统广播是一种全局的通知机制,应用可以注册BroadcastReceiver来监听特定的系统或自定义广播事件。 - **LiveData**:在Android架构组件中,...

    Android应用源码-Android安卓设计实例源代码15个合集.zip

    11. **设计模式**:源码中可能蕴含了单例模式、工厂模式、观察者模式等经典设计模式,这对于理解代码结构和可维护性至关重要。 12. **Material Design**:Android推荐遵循Material Design设计规范,源码可能体现了...

    Android 内容提供者、解释者和观察者小例

    在Android开发中,内容提供者(Content Provider)是Android系统中的四大组件之一,它负责管理应用程序间的数据共享。内容提供者让应用的数据可以被其他应用访问,实现了数据的跨应用共享。在这里,我们将深入探讨...

    Android编程典型实例与项目开发案例 光盘 源码

    总之,这份"Android编程典型实例与项目开发案例"光盘源码资源是学习和提升Android开发技能的宝贵资料,它提供了丰富的实践场景,帮助开发者将理论知识转化为实际动手能力,进一步推动个人在Android开发领域的专业...

    android开发中使用java观察者模式

    在Android开发中,Java观察者模式是一种常用的编程设计模式,用于处理对象间的依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式在处理多组件间的通信和数据同步时...

Global site tag (gtag.js) - Google Analytics