一、认识观察者模式

我们看看报纸和杂志的订阅是怎么回事:

1、报社的业务就是出版报纸。

2、向某家报社订阅报纸,只要他们有新的报纸出版,就会给你送来,只要你是他们的订户,你就会一直收到报纸。

3、当你不想在看到报纸的时候,取消订阅,他们就不会送新的报纸来。

4、只要报社还在运营,就会一直有人或单位向他们订阅报纸或取消订阅报纸。

出版者+订阅者=观察者模式  

如果你了解报纸的订阅是怎么回事,其实就知道观察者模式是怎么回事,只是名字不太一样:出版者改称为“主题”(subject),订阅者改称为“观察者”(Observer)。

让一张图来看得仔细一定:

上图中鸭子对象不是观察者,所有在主题数据改变时不会被通知,像你没有订阅报纸业务,报社有新的报纸出版时也不会发给你报纸一样,如果鸭子对象想成为观察者就需要告诉主题,它想当一个观察者。通过注册(订阅)告诉主题。

观察者模式定义:

  定义了对象之间的一对多依赖,这样一来,当一个对象改变状态使,它所有的依赖对象都会收到通知并自动更新。

松耦合:当两个对象之间松耦合,它们依然可以交互,但是不太清楚彼此之间的细节。

观察者模式提供了一种对象设计,让主题和观察者之间松耦合。

设计原则:为了交互对象之间的松耦合设计而努力。

实例代码:

/**
* 设计气象站
* 观察者模式:
* 这是主题接口,对象使用此接口注册为观察者,或者把自己从观察者中删除
* @author Administrator
*
*/
public abstract class Subject {
/**
* 通过此方法注册为观察者
* @param obj
*/
public abstract void registerObserver(Observer obj);
/**
* 通过此方法取消注册。
* @param obj
*/
public abstract void removeObserver(Observer obj);
/**
* 通过所有观察者更新信息
*/
public abstract void notifyObserver(); } /**
* 观察者接口,所有观察者都需要实现此接口,这样主题在需要通知观察者
* 时,有了一个共同的接口。
*
*/
public interface Observer { public void update(); } /**
* 一个具体主题,总是实现主题接口
* 除了注册和撤销方法之外,具体主题还实现了notifyObserver方法,此方法用于在状态改变时更新所有观察者。
* @author Administrator
*
*/
public class ConcreateSubject extends Subject { //加上一个list来记录观察者。
private ArrayList observer; public ConcreateSubject() {
observer=new ArrayList();
} @Override
public void registerObserver(Observer obj) {
observer.add(obj);
} @Override
public void removeObserver(Observer obj) {
observer.remove(obj);
} @Override
public void notifyObserver() {
for (int i = 0; i < observer.size(); i++) {
Observer obs=(Observer) observer.get(i);
//更新所有观察者最想信息
obs.update();
}
} } /**
* 具体观察者
*
*/
public class ConcreaeObserver implements Observer { private Subject subject;
/**
* 可在构造函数里面注册观察者
*/
public ConcreaeObserver(Subject subject) {
this.subject=subject;
this.subject.registerObserver(this);
} @Override
public void update() {
// TODO Auto-generated method stub
System.out.println("我是观察者1号.......................");
} } /**
* 具体观察者
* @author Administrator
*
*/
public class ConcreaeObserverA implements Observer { private Subject subject;
/**
* 可在构造函数里面注册观察者
*/
public ConcreaeObserverA(Subject subject) {
this.subject=subject;
this.subject.registerObserver(this);
} @Override
public void update() {
// TODO Auto-generated method stub
System.out.println("我是观察者2号.......................");
} }

 

/**
* 测试观察者模式
* 在对象之间定义一对多的依赖,这样当一个对象发生改变状态,其依赖对象都会收到通知更新状态。
*
*/
public class TestObserver {
public static void main(String[] args) {
ConcreateSubject subject = new ConcreateSubject(); ConcreaeObserver observer = new ConcreaeObserver(subject);// 注册观察者
ConcreaeObserverA observerA = new ConcreaeObserverA(subject);// 注册观察者
/*subject.registerObserver(observer);// 注册观察者
*/ //subject.registerObserver(observerA);// 注册观察者 subject.notifyObserver();// 通知所有观察者更新信息 } }

输出结果:

我是观察者1号.......................
我是观察者2号.......................

Java API有内置的观察者模式。Java.util包(package)内包含基本的Observer接口与Observerable类,这和我们的subject接口与observer接口很相似,Observer接口与Observerable类使用上更方便,因为许多功能已经事先准备好了。你甚至可以使用推(push)或拉(pull)的方式传送数据。

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

  1. 设计模式(二)The Observer Pattern 观察者模式

    问题引入 生成一个公告板显示当时的天气状况,当天气状况发生改变的时候公告板能够实时的更新. 模式定义 定义对象之间的一对多的依赖.当一个对象改变状态时,它的全部依赖者都会自己主动收到通知并自己主动更新 ...

  2. 设计模式之 Observer Pattern 观察者模式

    1.Subject通过一个容器保存零到多个Observer. 2.Subject通过Add,Delete方法调整Observer. 3.Subject的notifyObservers方法实际是逐个调用 ...

  3. Design Pattern: Observer Pattern

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

  4. 设计模式复习小结一(Strategy Pattern/Observer Pattern/Decorator Patter/Factory Pattern)

    目录: 前言 1. Stratrgy Pattern 2. Observer Pattern 3. Decorator Pattern 4. Factory Pattern 4.1 FactoryPa ...

  5. 深入浅出设计模式——观察者模式(Observer Pattern)

    模式动机 建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应.在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而 ...

  6. 设计模式 - 观察者模式(Observer Pattern) 详细说明

    观察者模式(Observer Pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...

  7. 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)

    原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...

  8. 设计模式 - 观察者模式(Observer Pattern) 详细解释

    观察者模式(Observer Pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...

  9. C#设计模式之十七观察者模式(Observer Pattern)【行为型】

    一.引言   今天是2017年11月份的最后一天,也就是2017年11月30日,利用今天再写一个模式,争取下个月(也就是12月份)把所有的模式写完,2018年,新的一年写一些新的东西.今天我们开始讲& ...

随机推荐

  1. Fragment全解析系列(三):Fragment之我的解决方案:Fragmentation

    源码地址:Github,欢迎Star,Fork. Demo网盘下载(V_0.7.13)Demo演示:单Activity + 多Fragment,项目中有3个Demo. 流式的单Activity+多Fr ...

  2. C4.5算法的学习笔记

    有日子没写博客了,这些天忙着一些杂七杂八的事情,直到某天,老师喊我好好把数据挖掘的算法搞一搞!于是便由再次埋头看起算法来!说起数据挖掘的算法,我想首先不得的不提起的就是大名鼎鼎的由决策树算法演化而来的 ...

  3. git无法定位程序输入点libiconv

    使用git clone时,报以下错误: 解决方案: 将git\bin\下的libiconv-2.dll复制到\git\libexec\git-core\下即可

  4. C# 关于委托和事件的妙文:通过一个例子详细介绍委托和事件的作用;Observer模式简介

    委托和事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见 ...

  5. Android 录音器

    Android自带的mediarecoder录音器不含pause暂停功能,解决方法:录制多个音频片段,最后合成一个文件. 参照 : http://blog.csdn.net/a601445984/ar ...

  6. BW顾问必需要清楚的:时间相关数据建模场景需求分析

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  7. Query Designer:Exception,不同的值显示不同的颜色

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  8. jpg/png格式图片转eps格式的方法总结

    jpg/png格式图片转eps格式的方法总结 转自http://blog.sina.com.cn/s/blog_5410e7b50101lme2.html 用latex写论文的筒子应该遇到这样的问题: ...

  9. Openstack+Kubernetes+Docker微服务实践之路--Docker和Registry2

    渐入佳境,我们开始比较具体的工作,由于Docker是一个基础组件,所以本文的主题是Docker和Registry2. 底层系统基于Centos7,先在一台云主机上安装Docker,Docker的安装非 ...

  10. moq 的常用使用方法

    测试方法                             Console.WriteLine(mock.Object.GetCountThing()); 匹配参数   mock.Setup(x ...