观察者模式:发布/订阅模式,当某对象(被观察者)状态发生改变时所有订阅该对象的观察者对象(观察者)都将更新自己

成员(4种):

1.抽象被观察者:将所有的观察者对象的引用存入一个集合,并且定义了添加 / 删除 / 更新观察者的接口,每一个被观察者都可以有若干个观察者。

2.具体被观察者:实现了抽象被观察者的各种方法,将观察者的具体状态存入具体观察者对象;当被观察者对象的状态发生改变时,通过更新观察者的方法调用观察者的更新方法更新具体观察者的状态

3.抽象观察者:定义了抽象的更新状态的方法

4.具体观察者:实现了抽象观察者的更新方法

最后在需要更新观察者状态的地方调用被观察者的更新状态的方法即可实现对所有观察者状态的更新

//抽象被观察者
public interface MyObservable { void add(MyObserver observer);
void remove(MyObserver observer);
void notifyMyObserver(String str);
}
//具体被观察者
public class MyConcreateObservable implements MyObservable {
private List<MyObserver> observers=new ArrayList<>(); @Override
public void add(MyObserver observer) {
observers.add(observer);
}
@Override
public void remove(MyObserver observer) {
observers.remove(observer);
}
@Override
public void notifyMyObserver(String str) {
for (MyObserver observer:observers){
observer.update(str);
}
}
}
//抽象观察者
public interface MyObserver { void update(String str);
}
//具体观察者
public class MyConcreateObserver implements MyObserver{ @Override
public void update(String str) {
Log.e("update",str);
}
}

点击btn_observers 同时更新所有订阅了的观察者的状态

       //定义观察者
MyObserver myObserver1 = new MyConcreateObserver();
MyObserver myObserver2 = new MyConcreateObserver();
MyObserver myObserver3 = new MyConcreateObserver(); final MyObservable myObservable = new MyConcreateObservable();
//添加观察者
myObservable.add(myObserver1) ;
myObservable.add(myObserver2);
myObservable.add(myObserver3); findViewById(R.id.btn_observers).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//更新观察者
myObservable.notifyMyObserver("BABANANA");
}
});

优点:将具体观察者与具体被观察者之间进行了解耦,使具体的观察者或被观察者分别依赖于他们的抽象类

缺点:但是抽象被观察者仍然依赖于抽象观察者

使用对象:1.一个对象的改变需要改变其他对象的状态时,而且被改变的对象数量未知

2.一个对象分为两个方面,一方面依赖于另一个方面时,可以将这两个方面各自封装在独立的对象中

Design pattern---观察者模式的更多相关文章

  1. 说说设计模式~大话目录(Design Pattern)

    回到占占推荐博客索引 设计模式(Design pattern)与其它知识不同,它没有华丽的外表,没有吸引人的工具去实现,它是一种心法,一种内功,如果你希望在软件开发领域有一种新的突破,一个质的飞越,那 ...

  2. 设计模式(Design Pattern)系列之.NET专题

    最近,不是特别忙,重新翻了下设计模式,特地在此记录一下.会不定期更新本系列专题文章. 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. 使用 ...

  3. Design Pattern: Observer Pattern

    1. Brief 一直对Observer Pattern和Pub/Sub Pattern有所混淆,下面打算通过这两篇Blog来梳理这两种模式.若有纰漏请大家指正. 2. Use Case 首先我们来面 ...

  4. [转]Design Pattern Interview Questions - Part 4

    Bridge Pattern, Composite Pattern, Decorator Pattern, Facade Pattern, COR Pattern, Proxy Pattern, te ...

  5. [转]Design Pattern Interview Questions - Part 2

    Interpeter , Iterator , Mediator , Memento and Observer design patterns. (I) what is Interpreter pat ...

  6. [转]Design Pattern Interview Questions - Part 3

    State, Stratergy, Visitor Adapter and fly weight design pattern from interview perspective. (I) Can ...

  7. [转]Design Pattern Interview Questions - Part 1

    Factory, Abstract factory, prototype pattern (B) What are design patterns? (A) Can you explain facto ...

  8. design pattern

    1. visitor design pattern http://butunclebob.com/ArticleS.UncleBob.IuseVisitor

  9. Scalaz(10)- Monad:就是一种函数式编程模式-a design pattern

    Monad typeclass不是一种类型,而是一种程序设计模式(design pattern),是泛函编程中最重要的编程概念,因而很多行内人把FP又称为Monadic Programming.这其中 ...

  10. 为什么要提倡“Design Pattern呢

    为什么要提倡“Design Pattern呢?根本原因是为了代码复用,增加可维护性. 那么怎么才能实现代码复用呢?面向对象有几个原则:开闭原则(Open Closed Principle,OCP).里 ...

随机推荐

  1. 【测试分析】HTSM模型

    ◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5508428.html 概述 HTSM全称Heuristic ...

  2. Java StringBuilder 高性能用法总结

    StringBuilder 误解: 1. Java编译优化后+和StringBuilder的效果一样: 2. StringBuilder不是线程安全的,为了"安全"起见最好还是用S ...

  3. javascript中的真假值、数据类型判断以及+的特殊用法

    一.javascript中的假值 jQuery中拥有一组数量奇大的假值,包括 0,NaN(非数),''(空字符串),false,null,undefined 这些值在if判断中全部等于假,但这些值彼此 ...

  4. javascript unit testing

    http://www.cnblogs.com/Answer1215/p/4230083.html Good http://developer.51cto.com/art/201506/479127.h ...

  5. js 格式化数字保留2位小数

    function toDecimal2(x) { var f = parseFloat(x); if (isNaN(f)) { return false; } var f = Math.round(x ...

  6. Windows消息机制概述

    消息是指什么?     消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉.一个消息,是系统定义的一个32位的值,他唯一的定义了一个事件,向 Windows发出一个通知,告诉应用程 ...

  7. 高DPI设置时禁用显示的方法

    在注册表 [HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers] 中添加exe的完 ...

  8. web页面状态

    200 :表示请求成功,服务器已处理 201 :表示服务器端请求被创建, 202 :表示服务器端请求已经被接收,但未处理完成 400 :表示错误的请求 404:表示请求的资源未找到. 405:表示没有 ...

  9. [已解决] windows 下 git 免输密码

    在 .git/config 里面加上这句话即 [credential] helper = store 原文地址:http://www.cnblogs.com/gifisan/p/5829578.htm ...

  10. noi 9267 核电站

    题目链接:http://noi.openjudge.cn/ch0206/9267/ 描述 一个核电站有N个放核物质的坑,坑排列在一条直线上.如果连续M个坑中放入核物质,则会发生爆炸,于是,在某些坑中可 ...