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

成员(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. LinkedBlockingQueue的put,add跟offer的区别

    LinkedBlockingQueue的put,add和offer的区别 最近在学习<<Java并发编程实践>>,有很多java.util.concurrent包下的新类.Li ...

  2. Wordpress基础:精简头部wp_head

    在Wordpress里 <?php wp_head(); ?> wp_head()是一个重要的函数,它允许插件开发者向你的站点动态地添加CSS和javascript,如果我们不在模板中引入 ...

  3. Requirejs之AMD规范

    一.什么是AMD规范 AMD是Asynchronous Module Definition-----异步模块定义 AMD规范定义了2个函数define()与require() 下面我们来看一下定义方法 ...

  4. python时间操作总结

    Unix时间戳 Unix时间戳(Unix timestamp),或称Unix时间(Unix time).POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970年01月 ...

  5. 微信公众平台开发(26) ACCESS TOKEN

    本文介绍微信公众平台下Access Token的概念及获取方法. 一.Access Token access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.正常 ...

  6. Flume -- 开源分布式日志收集系统

    Flume是Cloudera提供的一个高可用的.高可靠的开源分布式海量日志收集系统,日志数据可以经过Flume流向需要存储终端目的地.这里的日志是一个统称,泛指文件.操作记录等许多数据. 一.Flum ...

  7. Leetcode: Repeated Substring Pattern

    Given a non-empty string check if it can be constructed by taking a substring of it and appending mu ...

  8. SQL2005中的事务与锁定(五)- 转载

    ------------------------------------------------------------------------ -- Author : HappyFlyStone - ...

  9. 初识python第二天(3)

    我们接着上一篇博客,继续来来了解Python一些常见类的函数使用方法 一.int # 运算符,>=,比较self是否大于等于value,只要满足大于或者等于其中一个条件,就返回True,否则就返 ...

  10. PLSQL Developer 不能连接 oracle 12c 64位 的解决办法 for win 64

    1.安装Oracle 12c 64位 2.安装32位的Oracle客户端( instantclient-basic-nt-12.1.0.1.0) 1) 下载instantclient-basic-nt ...