Design pattern---观察者模式
观察者模式:发布/订阅模式,当某对象(被观察者)状态发生改变时所有订阅该对象的观察者对象(观察者)都将更新自己
成员(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---观察者模式的更多相关文章
- 说说设计模式~大话目录(Design Pattern)
回到占占推荐博客索引 设计模式(Design pattern)与其它知识不同,它没有华丽的外表,没有吸引人的工具去实现,它是一种心法,一种内功,如果你希望在软件开发领域有一种新的突破,一个质的飞越,那 ...
- 设计模式(Design Pattern)系列之.NET专题
最近,不是特别忙,重新翻了下设计模式,特地在此记录一下.会不定期更新本系列专题文章. 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. 使用 ...
- Design Pattern: Observer Pattern
1. Brief 一直对Observer Pattern和Pub/Sub Pattern有所混淆,下面打算通过这两篇Blog来梳理这两种模式.若有纰漏请大家指正. 2. Use Case 首先我们来面 ...
- [转]Design Pattern Interview Questions - Part 4
Bridge Pattern, Composite Pattern, Decorator Pattern, Facade Pattern, COR Pattern, Proxy Pattern, te ...
- [转]Design Pattern Interview Questions - Part 2
Interpeter , Iterator , Mediator , Memento and Observer design patterns. (I) what is Interpreter pat ...
- [转]Design Pattern Interview Questions - Part 3
State, Stratergy, Visitor Adapter and fly weight design pattern from interview perspective. (I) Can ...
- [转]Design Pattern Interview Questions - Part 1
Factory, Abstract factory, prototype pattern (B) What are design patterns? (A) Can you explain facto ...
- design pattern
1. visitor design pattern http://butunclebob.com/ArticleS.UncleBob.IuseVisitor
- Scalaz(10)- Monad:就是一种函数式编程模式-a design pattern
Monad typeclass不是一种类型,而是一种程序设计模式(design pattern),是泛函编程中最重要的编程概念,因而很多行内人把FP又称为Monadic Programming.这其中 ...
- 为什么要提倡“Design Pattern呢
为什么要提倡“Design Pattern呢?根本原因是为了代码复用,增加可维护性. 那么怎么才能实现代码复用呢?面向对象有几个原则:开闭原则(Open Closed Principle,OCP).里 ...
随机推荐
- override与overload的区别
override(重写,覆盖) 1.方法名.参数.返回值相同. 2.子类方法不能缩小父类方法的访问权限. 3.子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常). 4.存在于父类和子类之 ...
- 从oracle数据表中读取表结构
drop table aa_tab;create table aa_tab asselect A.TABLE_NAME 表名, A.column_name 字段名,A.data_type 数据 ...
- cmdb models数据库结构
from __future__ import unicode_literals from django.contrib.auth.models import User from django.db i ...
- 检测浏览器是否支持cookie方法
cookie 摘自: http://www.cnblogs.com/fish-li/archive/2011/07/03/2096903.html Cookie是什么? Cookie 是一小段文本信息 ...
- leetcode 374
这个题目很简单,但是要注意细节和对题目的理解,一开始我把guess函数的作用理解错了,第一版代码长这样: int guessNumber(int n) { ; int high = n; while( ...
- Leetcode: Pacific Atlantic Water Flow
Given an m x n matrix of non-negative integers representing the height of each unit cell in a contin ...
- struts2实现文件上传、多文件上传和文件下载
总结的两个问题,就是struts2上传下载的时候对属性名配置要求非常严格: 第一:上传的时候 private File file; private String fileContentType; pr ...
- svn提交时强制添加注释
1,找到Repositories 文件夹 2,在Repositories 中找到对应的工程, 3,在工程下找到hooks文件夹 4.在hooks文件夹下添加 :pre-commit.bat文件;文件内 ...
- ajax+jquery+ashx如何实现上传文件
第一:建立Default.aspx页面 <html> <head runat="server"> <title>ajax图片上传</tit ...
- 运行TLD
TLD(跟踪学习检测)是英国萨里大学的捷克学生Zdenek Kalal在其2010的一篇论文中提出的实时性较好的单目标长时间跟踪算法.其主页上有相关的文章下载,源码是从这里下载的,还可以找到安装步骤, ...