设计模式-观察者

原创 2016年08月30日 13:27:50

Android实际开发中遇到的应用场景:首界面 跳转到 消息列表 跳转到消息详情。当收到新的消息的时候,首页和消息列表要有小红点的提醒,使用观察者模式实现,降低代码的耦合度

被观察者

public class MessageObservable extends Observable {

    private static MessageObservable instance;

    private MessageObservable() {
    }

    public static MessageObservable getInstance() {
        if (instance == null) {
            instance = new MessageObservable();
        }
        return instance;
    }

    public void notifyDataChange() {
        setChanged();
        notifyObservers();
    }
}

首页注册观察者

public class MainActivity extends Activity implements Observer {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        MessageObservable.getInstance().addObserver(this);
    }


    @Override
    public void update(Observable observable, Object data) {
        //TODO 更新首页状态
    }
}

消息列表注册观察者

public class MessageListActivity extends Activity implements Observer {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        MessageObservable.getInstance().addObserver(this);
    }

    @Override
    public void update(Observable observable, Object data) {
        //TODO 数据源发生变化,更新界面状态
    }
}

模拟消息服务中收到消息,通知界面更新

public class MessageServer extends Service{
    @Override
    public IBinder onBind(Intent intent) {
        //模拟收到新的消息,通知相关界面更新
        MessageObservable.getInstance().notifyDataChange();
        return null;
    }
}

附上Observable 部分代码,添加删除遍历的操作已由Observable 类实现

public class Observable {

    List<Observer> observers = new ArrayList<Observer>();

    boolean changed = false;

    public Observable() {
    }

    public void addObserver(Observer observer) {
        if (observer == null) {
            throw new NullPointerException("observer == null");
        }
        synchronized (this) {
            if (!observers.contains(observer))
                observers.add(observer);
        }
    }

    public synchronized void deleteObservers() {
            observers.clear();
    }

    public void notifyObservers(Object data) {
        int size = 0;
        Observer[] arrays = null;
        synchronized (this) {
            if (hasChanged()) {
                clearChanged();
                size = observers.size();
                arrays = new Observer[size];
                observers.toArray(arrays);
            }
        }
        if (arrays != null) {
            for (Observer observer : arrays) {
                observer.update(this, data);
            }
        }
    }   
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

Swift设计模式之观察者模式

转自 Swift设计模式 原文 Design-Patterns-In-Swift // 观察者模式 // 一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫...
  • aotian16
  • aotian16
  • 2016年05月12日 11:37
  • 1127

观察者模式简单例子

观测者模式定义了对象之间的一对多依赖,当一个对象状态发生改变时,其依赖者便会收到通知并做相应的更新。其原则是:为交互对象之间松耦合。以松耦合方式在一系列对象之间沟通状态,我们可以独立复用主题(Subj...
  • qq_15128547
  • qq_15128547
  • 2016年11月17日 20:00
  • 3024

设计模式介绍之七:观察者模式(observer)

观察者模式(又称发布/订阅模式)定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新...
  • foruok
  • foruok
  • 2014年02月18日 19:55
  • 7311

Java中的观察者模式

1.相关类介绍 public class Observable extends Object 此类表示模型视图范例中的 observable 对象,或者说“数据”。可将其子类化,表示应用程序想要观察...
  • singwhatiwanna
  • singwhatiwanna
  • 2013年07月02日 16:45
  • 10860

观察者模式 详解

定义 一个或多个观察者对目标的状态感兴趣,它们通过将自己依附在目标对象上以便注册所感兴趣的内容。 目标状态发生改变并且观察者可能对这些改变感兴趣,就会发送一个通知消息,调用每个观察者的更新方法。 当观...
  • u010388497
  • u010388497
  • 2016年06月18日 17:31
  • 526

C# ~ 从 委托事件 到 观察者模式

委托和事件的部分基础知识可参见 C#/.NET 基础学习 之 [委托-事件] 部分 ;参考 [1]. 从无到有 谈委托、事件和观察者模式; [2]. 初识事件 到 自定义事件; [3]. 从类型...
  • qing101
  • qing101
  • 2016年08月15日 19:00
  • 1647

设计模式C++实现——观察者模式

观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。        观察者模式结构图如下:                举例:      ...
  • walkerkalr
  • walkerkalr
  • 2014年06月04日 19:51
  • 1173

Java内置观察者模式

之前也简单地写过观察者模式(又称为发布-订阅模式)小例子,现在项目中也常用到该模式。今天贴一下如何使用Java内置的观察者模式。 主要使用到的Java API就两个类:Observer接口:观察者对象...
  • true100
  • true100
  • 2016年11月02日 09:56
  • 1368

【RxJava 实践系列】(二)创建观察者与被观察者

【RxJava 实践系列】(一)基础知识 【RxJava 实践系列】(二)创建观察者与被观察者 【RxJava 实践系列】(三)线程控制 — Scheduler 【RxJava 实践系列】(...
  • q275549832
  • q275549832
  • 2016年11月13日 14:00
  • 521

iOS中 KVO 键值观察者

KVO Key-Value-Obsever 键值观察者 1.首先要有一个观察者,此时被观察者是自己找一个观察者观察自己的key值对应的value值有没有改变,如果改变了就可以做一些响应的操作 创建一个...
  • qq_31810357
  • qq_31810357
  • 2015年10月12日 19:06
  • 1540
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式-观察者
举报原因:
原因补充:

(最多只允许输入30个字)