摘要:里面的观察者模式,是一个非常经典的模式,经常在开发中被用到,掌握了这个思想,我相信对于一些开发,受益是匪浅的鄙人也是觉得比较不错,所以发表一点自己的总结,如果对还处于迷茫的你有稍微的帮助的话,鄙人很高兴下面就让我们共同的理解一下一需求在开发
Java里面的观察者模式,是一个非常经典的模式,经常在开发中被用到,掌握了这个思想,我相信对于一些开发,受益是匪浅的;鄙人也是觉得比较不错,所以发表一点自己的总结,如果对还处于迷茫的你有稍微的帮助的话,鄙人很高兴;下面就让我们共同的理解一下:
一、需求:
在开发的过程中我们会遇到比较实际额问题就是比如一个事物某种状态发生了改变,想让其他关心它的事物知道,而不是,其他的事物一直看着它,那么就可以抽出一个基本的思想,就是让关心的事物订阅被关心的事物,然后被关心的事物一旦有了改变就去通知关心的事物,如下图:
我们可以清楚的看出被观察者要做的事情,就是添加观察者、删除观察者以及状态更新之后要通知观察者做相应的操作,而观察者,就是得到数据;到此的话,似乎有点眉目了;
二、设计:
知道了思路了,就是需要把思路设计出来;接下来,我们就自己化抽象为具体,化腐朽为神奇:
被观察者(成为目标对象):Subject
观察者:(监督者):Observer
Subject类的实现:
import java.util.ArrayList; import java.util.List; /** *创建人:UncleMin *时间:2017/3/11 0011-下午 6:58 *描述:Subject:目标对象;注册与通知观察者 *链接:http://blog.csdn.net/wz1993_0719/article/details/60783657 */ public class Subject{ private Listobservers = new ArrayList<>(); public void addObserver(Observer observer){ //添加观察者的方法: observers.add(observer); } public void removeObserver(Observer observer){ //删除观察者 observers.remove(observer); } protected void notifyObserves(){ //通知观察者 for (Observer observer:observers) { observer.updata(this); } } }
Observer类的实现:
/** *创建人:UncleMin *时间:2017/3/11 0011-下午 6:15 *描述:观察者的接口对象:Observer *链接:http://blog.csdn.net/wz1993_0719/article/details/60783657 */ public interface Observer { //更新方法 public void updata(Subject subject); }
上面Observable被观察者的基类,为了给具体被观察者继承的,而Observer是接口,里面的方法是刷新数据的;
三、下面就是具体的调用和实现:
import java.util.Observable; /** *创建人:UncleMin *时间:2017/3/11 0011-下午 6:59 *描述:ConcreteSubject:具体的目标对象,负责数据完成之后通知观察者ds *链接:http://blog.csdn.net/wz1993_0719/article/details/60783657 */ public class ConcreteSubject extends Subject { private String mContent; public String getmContent() { return mContent; } public void setmContent(String mContent) { this.mContent = mContent; notifyObserves(); } } ** *创建人:UncleMin *时间:2017/3/11 0011-下午 6:57 *描述:ConcreteObserver:具体的实现观察者对象 *链接:http://blog.csdn.net/wz1993_0719/article/details/60783657 */ public class ConcreteObserver implements Observer { @Override public void updata(Subject subject) { String s = ((ConcreteSubject) subject).getmContent(); Log.e("ob", "updata: "+s); } }
测试调用:
import android.app.Activity; import android.os.Bundle; import android.view.View; /** * 创建人:UncleMin * 时间:2017/3/11 0011-下午 6:28 * 描述: * 链接:http://blog.csdn.net/wz1993_0719/article/details/60783657 */ public class ObserverActivity extends Activity { private ConcreteSubject subject; private ConcreteObserver observer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_observe); subject = new ConcreteSubject(); observer = new ConcreteObserver(); subject.addObserver(observer); } public void onClick(View view) { int id = view.getId(); switch (id){ case R.id.btn_send: subject.setmContent("我是天气晴朗哦,嘻嘻!"); break; case R.id.btn_remove: subject.removeObserver(observer); break; } } @Override protected void onDestroy() { super.onDestroy(); } }
上面就是观察者模式的通用的思路与代码,到这里其实回过头来,明白了思想,其实也是很简单的,当然,这么经典的东西,Java的编写人肯定不会遗漏的,其实java里面的Util包已经给我们写好了两个基类,我们用的时候可以直接的调用就ok了;
四、下面就是Java包下的引用:
被观察者:
package com.example.wz.mystudydemo; import java.util.Observable; /** *创建人:UncleMin *时间:2017/3/11 0011-下午 6:59 *描述:ConcreteSubject:具体的目标对象,负责数据完成之后通知观察者ds *链接:http://blog.csdn.net/wz1993_0719/article/details/60783657 */ public class ConcreteSubject extends Observable { private String mContent; public String getmContent() { return mContent; } public void setmContent(String mContent) { this.mContent = mContent; setChanged(); notifyObservers(); } }
观察者:
import android.util.Log;
import java.util.*;
/** *创建人:UncleMin *时间:2017/3/11 0011-下午 6:57 *描述:ConcreteObserver:具体的实现观察者对象 *链接:http://blog.csdn.net/wz1993_0719/article/details/60783657 */ public class ConcreteObserver implements java.util.Observer { @Override public void update(Observable observable, Object data) { String s = ((ConcreteSubject) observable).getmContent(); Log.e("ob", "updata: "+s); } /*@Override public void updata(Subject subject) { String s = ((ConcreteSubject) subject).getmContent(); Log.e("ob", "updata: "+s); }*/ }
再观察者模式里面有两种实现方式:推模模型和拉模型;若是感兴趣的童鞋们可以自己去研究一下,毕竟纸上得来终觉浅,绝知此事要躬行
总结:
1.观察者模式的优点:(1)实现了观察者与目标时间的抽象解耦;(2)实现了动态联动;(3)支持广播通信
2.缺点:引起无所谓的操作;例如一些没必要的通知、
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/13800.html
摘要:三内置观察者模式了解内置观察者模式包内包含最基本的类与接口,这和上面的接口与接口很类似。根据具体的需求,如果内置的观察者模式不能满设计,那么我们可以像刚开始那样自己实现一套观察者模式。参考资料设计模式 一、了解观察者模式 1.1 什么是观察者模式 观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象状态改变时,它的所有依赖者都会收到通知并自动更新。 典型的问题比如报社,只要你是他...
摘要:观察者模式的使用场景比如你微博关注了一个人,那么这个人发布的微博就会推送到你这。 Java设计模式之观察者模式 一直想写一篇学习观察者模式的总结没有契机,今天学习阻塞队列的原理时候看到在实现生产者消费者的时候用到了通知模式,就是所谓的观察者模式,正好顺便整理一下。 1. 简介 观察者模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更...
摘要:观察者模式观察者模式也可以成为发布订阅模式,此模式是对象之间的模式,对象之间呈现一种一对多的关系。其中的一是被观察者,多是观察者,故被观察者不能产生多个对象,只能有一个对象供观察者观察,所以在写被观察者的时候,需要使用到单例模式。 观察者(Observer)模式 观察者(Observer)模式 也可以成为发布订阅模式,此模式是对象之间的模式,对象之间呈现一种一对多的关系。其中的一是被观...
摘要:为了帮助灰太狼摆脱被老婆平底锅抽的悲剧,发起了解救灰太狼的行动,必须要知道观察者模式。持有观察者对象的集合。设计模式源码下载 相信大家都有看过《喜洋洋与灰太狼》,说的是灰太狼和羊族的斗争,而每次的结果都是灰太狼一飞冲天,伴随着一句我还会回来的......。为灰太狼感到悲哀,抓不到羊,在家也被老婆平底锅虐待。灰太狼为什么会这么背? 很简单,灰太狼本身就有暴露行踪的属性,羊咩咩就能知晓灰太...
摘要:为了帮助灰太狼摆脱被老婆平底锅抽的悲剧,发起了解救灰太狼的行动,必须要知道观察者模式。持有观察者对象的集合。设计模式源码下载 相信大家都有看过《喜洋洋与灰太狼》,说的是灰太狼和羊族的斗争,而每次的结果都是灰太狼一飞冲天,伴随着一句我还会回来的......。为灰太狼感到悲哀,抓不到羊,在家也被老婆平底锅虐待。灰太狼为什么会这么背? 很简单,灰太狼本身就有暴露行踪的属性,羊咩咩就能知晓灰太...
摘要:观察者模式涉及的角色主题一对多中的一,持有数据,当数据更新时,通知已注册的观察者观察者一对多中的多,接收主题数据做出响应举个栗子一位妈妈主题有两个孩子,取名为小爱和小冰观察者。 概念 观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象状态改变时,他的所有依赖者都会收到通知并自动更新。 showImg(https://segmentfault.com/img/bVbf0or?w...
阅读 2045·2021-11-19 09:40
阅读 2421·2021-09-30 09:48
阅读 2457·2019-08-30 14:10
阅读 2610·2019-08-29 11:22
阅读 1727·2019-08-26 13:51
阅读 2138·2019-08-26 12:02
阅读 2222·2019-08-23 16:06
阅读 3409·2019-08-23 14:06