当前位置:首页>科技>正文

观察者模式和发布/订阅模式的区别 android中观察者模式的应用场景是什么

2023-04-17 14:24:26 互联网 未知 科技

 观察者模式和发布/订阅模式的区别 android中观察者模式的应用场景是什么

观察者模式和发布/订阅模式的区别

观察者(Observer)模式又名发布-订阅(Publish/Subscribe)模式。GOF给观察者模式如下定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

在这里先讲一下面向对象设计的一个重要原则——单一职责原则。因此系统的每个对象应该将重点放在问题域中的离散抽象上。因此理想的情况下,一个对象只做一件事情。这样在开发中也就带来了诸多的好处:提供了重用性和维护性,也是进行重构的良好的基础。

因此几乎所有的设计模式都是基于这个基本的设计原则来的。观察者模式的起源我觉得应该是在GUI和业务数据的处理上,因为现在绝大多数讲解观察者模式的例子都是这一题材。但是观察者模式的应用决不仅限于此一方面。

下面我们就来看看观察者模式的组成部分。

1) 抽象目标角色(Subject):目标角色知道它的观察者,可以有任意多个观察者观察同一个目标。并且提供注册和删除观察者对象的接口。目标角色往往由抽象类或者接口来实现。

2) 抽象观察者角色(Observer):为那些在目标发生改变时需要获得通知的对象定义一个更新接口。抽象观察者角色主要由抽象类或者接口来实现。

3) 具体目标角色(Concrete Subject):将有关状态存入各个Concrete Observer对象。当它的状态发生改变时, 向它的各个观察者发出通知。

4) 具体观察者角色(Concrete Observer):存储有关状态,这些状态应与目标的状态保持一致。实现Observer的更新接口以使自身状态与目标的状态保持一致。在本角色内也可以维护一个指向Concrete Subject对象的引用。

android中观察者模式的应用场景是什么?

你说的场景是符合这个模式的:
观察者模式的应用场景:
1、 对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。
2、 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。
观察者模式的优点:
1、 Subject和Observer之间是松偶合的,分别可以各自独立改变。
2、 Subject在发送广播通知的时候,无须指定具体的Observer,Observer可以自己决定是否要订阅Subject的通知。
3、 遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。

Android 开发中常用到的设计模式有哪些

1 Android设计模式
2 Android设计模式—策略模式
3 Android设计模式系列-单例模式
4 Android设计模式系列--工厂方法模式
5 Android设计模式系列-适配器模式
6 Android设计模式系列--原型模式
7 Android设计模式系列--观察者模式
8 Android设计模式系列--模板方法模式

Android涉及到的设计模式有哪些?

1、适配器模式:ListView或GridView的Adapter

简介:不同的数据提供者使用一个适配器来向一个相同的客户提供服务。

2、建造者模式:AlertDialog.Builder

简介:可以分步地构造每一部分。

3、命令模式:Handler.post后Handler.handleMessage

简介:把请求封装成一个对象发送出去,方便定制、排队、取消。

4、享元模式:Message.obtainMessage通过重用Message对象来避免大量的Message对象被频繁的创建和销毁。

简介:运用共享技术有效地支持大量细粒度的对象。

5、迭代器模式:如通过Hashtable.elements方法可以得到一个Enumeration,然后通过这个Enumeration访问Hashtable中的数据,而不用关心Hashtable中的数据存放方式。

简介:提供一个方法顺序访问数据集合中的所有数据而又不暴露对象的内部表示。

6、备忘录模式:Activity的onSaveInstanceState和onRestoreInstanceState就是通过Bundle这种序列化的数据结构来存储Activity的状态,至于其中存储的数据结构,这两个方法不用关心

简介:不需要了解对象的内部结构的情况下备份对象的状态,方便以后恢复。

7、观察者模式:我们可以通过BaseAdapter.registerDataSetObserver和BaseAdapter.unregisterDataSetObserver两方法来向BaseAdater注册、注销一个DataSetObserver。这个过程中,DataSetObserver就是一个观察者,它一旦发现BaseAdapter内部数据有变量,就会通过回调方法DataSetObserver.onChanged和DataSetObserver.onInvalidated来通知DataSetObserver的实现类。事件通知也是观察者模式

简介:一个对象发生改变时,所有信赖于它的对象自动做相应改变。

8、原型模式:比如我们需要一张Bitmap的几种不同格式:ARGB_8888、RGB_565、ARGB_4444、ALAPHA_8等。那我们就可以先创建一个ARGB_8888的Bitmap作为原型,在它的基础上,通过调用Bitmap.copy(Config)来创建出其它几种格式的Bitmap。另外一个例子就是Java中所有对象都有的一个名字叫clone的方法,已经原型模式的代名词了

简介:在系统中要创建大量的对象,这些对象之间具有几乎完全相同的功能,只是在细节上有一点儿差别。

9、代理模式:类似于ios开发的delegate委托模式,所有的AIDL都一个代理模式的例子。假设一个Activity A去绑定一个Service S,那么A调用S中的每一个方法其实都是通过系统的Binder机制的中转,然后调用S中的对应方法来做到的。Binder机制就起到了代理的作用。

简介:为其他对象提供一种代理以控制对这个对象的访问。

10、状态模式:View.onVisibilityChanged方法,就是提供了一个状态模式的实现,允许在View的visibility发生改变时,引发执行onVisibilityChanged方法中的动作。

简介:状态发生改变时,行为改变。

11、策略模式:

举例:Java.util.List就是定义了一个增(add)、删(remove)、改(set)、查(indexOf)策略,至于实现这个策略的ArrayList、LinkedList等类,只是在具体实现时采用了不同的算法。但因为它们策略一样,不考虑速度的情况下,使用时完全可以互相替换使用。

简介:定义了一系列封装了算法、行为的对象,他们可以相互替换。

12、调解者模式

简介:一个对象的某个操作需要调用N个对象的M个方法来完成时,把这些调用过程封装起来,就成了一个调解者

举例:如Resource.getDrawable方法的实现逻辑是这样的:创建一个缓存来存放所有已经加载过的,如果getDrawable中传入的id所对应的Drawable以前没有被加载过,那么它就会根据id所对应的资源类型,分别调用XML解析器生成,或者通过读取包中的图片资源文件来创建Drawable。

而Resource.getDrawable把涉及到多个对象、多个逻辑的操作封装成一个方法,就实现了一个调解者的角色。

13、抽象工厂模式

DAO与Service的使用

Android中有没有对多个对象的监听方法,就像观察者模式一样

Android
中的监听器模式与观察者模式

1、 观察者模式与监听器机制

1.1 观察者模式

1.2 监听器(Listener)机制

代码的基本框架:

* 被监控着

package com.wonders.group

import java.util.Collection

public class ModelTie {

private CollectiondataSet public interface DataSetSupervioer { public void onChange() } private DataSetSupervioer dataSetChangeListener public void setDataSetChangeListener(DataSetSupervioer dataSetChangeListener) { this.dataSetChangeListener = dataSetChangeListener } public void notifyDataSetChange() { if (null != dataSetChangeListener) { dataSetChangeListener.onChange() } } public Collection getDataSet() { return dataSet } public ModelTie setDataSet(Collection dataSet) { this.dataSet = dataSet this.notifyDataSetChange() // 数据设置完毕要通知监听器进行更新操作 return this } } * 监控者 package com.wonders.group import java.util.Collection import java.util.Iterator import com.wonders.group.ModelTie.DataSetSupervioer public class PresentationTie { private ModelTie model public PresentationTie() { super() // 添加监听器 model.setDataSetChangeListener(new DataSetSupervioer() { public void onChange() { // 填写一些前置操作,如更新数据 DisplayModel() // 重新绘制 // 填写一些后置操作,如更新状态 } }) } public void DisplayModel() { Collection collection = model.getDataSet() if (collection != null) { for (Iterator iterator = collection.iterator() iterator.hasNext()) { System.out.println(((Object) iterator.next()).toString()) // 其他等等操作 } } } public ModelTie getModel() { return model } public void setModel(ModelTie model) { this.model = model } } 2、 ArrayAdapter的观察者实现机制 以下仅罗列关键代码: public class ArrayAdapter extends BaseAdapter implements Filterable { private boolean mNotifyOnChange = true /** * Adds the specified object at the end of the array. */ public void add(T object) { if (mOriginalValues != null) { synchronized (mLock) { mOriginalValues.add(object) if (mNotifyOnChange) notifyDataSetChanged() } } else { mObjects.add(object) if (mNotifyOnChange) notifyDataSetChanged() } } /** * Inserts the specified object at the specified index in the array. */ public void insert(T object, int index) { if (mOriginalValues != null) { synchronized (mLock) { mOriginalValues.add(index, object) if (mNotifyOnChange) notifyDataSetChanged() } } else { mObjects.add(index, object) if (mNotifyOnChange) notifyDataSetChanged() } } /** * Removes the specified object from the array. */ public void remove(T object) { if (mOriginalValues != null) { synchronized (mLock) { mOriginalValues.remove(object) } } else { mObjects.remove(object) } if (mNotifyOnChange) notifyDataSetChanged() } /** * Remove all elements from the list. */ public void clear() { if (mOriginalValues != null) { synchronized (mLock) { mOriginalValues.clear() } } else { mObjects.clear() } if (mNotifyOnChange) notifyDataSetChanged() } /** * Sorts the content of this adapter using the specified comparator. */ public void sort(Comparator comparator) { Collections.sort(mObjects, comparator) if (mNotifyOnChange) notifyDataSetChanged() } @Override public void notifyDataSetChanged() { super.notifyDataSetChanged() // 关键代码,这个notifyDataSetChanged()是从父类BaseAdapter继承过来的,所以看看在父类中它干了些什么 mNotifyOnChange = true } } /** * Common base class of common implementation for an {@link Adapter} that can be * used in both {@link ListView} (by implementing the specialized * {@link ListAdapter} interface} and {@link Spinner} (by implementing the * specialized {@link SpinnerAdapter} interface. */ public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter { private final DataSetObservable mDataSetObservable = new DataSetObservable() public void registerDataSetObserver(DataSetObserver observer) { 这对方法用来注册或注销 观察ArrayAdapter的观察者的 mDataSetObservable.registerObserver(observer) } public void unregisterDataSetObserver(DataSetObserver observer) { mDataSetObservable.unregisterObserver(observer) } /** * Notifies the attached View that the underlying data has been changed * and it should refresh itself. */ public void notifyDataSetChanged() { mDataSetObservable.notifyChanged() // 关键代码:说明调的是成员变量mDataSetObservable的方法,所以进入DataSetObservable看看具体是如何操作的 } public void notifyDataSetInvalidated() { mDataSetObservable.notifyInvalidated() } } package android.database /** * A specialization of Observable for DataSetObserver that provides methods for * invoking the various callback methods of DataSetObserver. */ public class DataSetObservable extends Observable { /** * Invokes onChanged on each observer. Called when the data set being observed has * changed, and which when read contains the new state of the data. */ public void notifyChanged() { synchronized(mObservers) { for (DataSetObserver observer : mObservers) { // 这里的mObservers是哪来的呢?继续追踪,但首先可以判断是来自Observable的。进入看看 observer.onChanged() } } } /** * Invokes onInvalidated on each observer. Called when the data set being monitored * has changed such that it is no longer valid. */ public void notifyInvalidated() { synchronized (mObservers) { for (DataSetObserver observer : mObservers) { observer.onInvalidated() } } } } public abstract class Observable { /** * The list of observers. An observer can be in the list at most * once and will never be null. */ protected final ArrayList mObservers = new ArrayList() public void registerObserver(T observer) { if (observer == null) { throw new IllegalArgumentException("The observer is null.") } synchronized(mObservers) { if (mObservers.contains(observer)) { throw new IllegalStateException("Observer " observer " is already registered.") } mObservers.add(observer) } } public void unregisterObserver(T observer) { if (observer == null) { throw new IllegalArgumentException("The observer is null.") } synchronized(mObservers) { int index = mObservers.indexOf(observer) if (index == -1) { throw new IllegalStateException("Observer " observer " was not registered.") } mObservers.remove(index) } } public void unregisterAll() { synchronized(mObservers) { mObservers.clear() } } }

Android系统手机几种运行模式解析

Android系统中具备6个模式,分别为一般启动模式(normal mode)、安全模式(safe mode)、恢复模式(recovery mode)、引导模式(bootloader mode)、fastboot模式和诊断模式(diagnostic mode)。
  一般启动模式(normal mode)的功能是正常启动手机,方法为关机状态下按电源键启动。
  安全模式(safe mode)。此模式和正常启动一样,但没有登记Google,所以不能访问Market或使用你的Google账号。操作方法为按住“menu”键,按电源键启动手机,直至手机启动完成松开“menu”键。
  恢复模式(recovery mode)可打开命令解释程序(shell),刷新映像文件(flash image),执行备份等。当然这一切取决于你手机上的recovery image版本。使用方法很简单,就是home键和电源键一起按。
  引导模式(bootloader mode)的功能是从SD卡上安装新的系统映像(DREAIMG.NBH),只需再按一次电源键。值得一提的事为Android手机获取root权限,就是使用这个模式。操作方法为照相键和电源键一起按。
  fastboot模式主要是在电脑上使用fastboot命令来刷新映像文件。使用方法为按住返回键,按电源键启动手机,直至屏幕出现FASTBOOT字样后松开返回键。

观察者模式的基本简介

观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。
观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。