观察者模式
交通信号灯是汽车的观察目标,汽车是观察者
一个对象的状态或行为的变化将导致其他对象的状态或行为也发生变化
为了描述这种一对多或一对一的联动,观察者模式应运而生
在观察者模式中,发生改变的对象成为观察目标,而被通知的对象成为观察者。一个观察目标可以对应多个观察者。
别名
发布与订阅模式
模型与视图模式
源监听模式
从属者模式
角色
Subject目标、主题、被观察对象
定义观察者集合
提供方法增加和删除观察者对象
定义通知方法notify
可以是接口、抽象类或具体类
ConcreteSubject具体目标
包含经常发生改变的数据
状态改变向观察者发出通知
Observer观察者
对观察目标的改变做出反应
声明更新数据的方法update
ConcreteObserver具体观察者
存储具体观察者的状态
实现update方法
调用目标类的attach方法,加入集合
或通过detach方法将自己从目标类的集合中删除

看例子

1.抽象观察目标

package Observer;

/**
* Created by Jiqing on 2016/10/28.
*/
import java.util.*; public abstract class MySubject
{
protected ArrayList observers = new ArrayList(); //注册方法
public void attach(MyObserver observer)
{
observers.add(observer);
} //注销方法
public void detach(MyObserver observer)
{
observers.remove(observer);
} public abstract void cry(); //抽象通知方法
}

2.具体观察目标,猫

package Observer;

/**
* Created by Jiqing on 2016/10/28.
*/
public class CatSubject extends MySubject{
public void cry() {
System.out.println("猫叫!");
System.out.println("----------------------");
for(Object obj:observers) {
((MyObserver)obj).response();
}
}
}

3.抽象观察者

package Observer;

/**
* Created by Jiqing on 2016/10/28.
*/
public interface MyObserver
{
void response(); //抽象响应方法
}

4.具体观察者

package Observer;

/**
* Created by Jiqing on 2016/10/28.
*/
public class DogObserver implements MyObserver{
public void response() {
System.out.println("狗跟着叫!");
}
}
package Observer;

/**
* Created by Jiqing on 2016/10/28.
*/
public class PigObserver implements MyObserver{
public void response() {
System.out.println("猪也哄哄乱叫!");
}
}

5.调用过程

package Observer;

/**
* Created by Jiqing on 2016/10/28.
*/
public class Client {
public static void main(String a[])
{
MySubject subject=new CatSubject(); MyObserver obs1,obs2;
obs1=new DogObserver();
obs2=new PigObserver(); subject.attach(obs1);
subject.attach(obs2); subject.cry();
}
}

执行结果:

猫叫!
----------------------
狗跟着叫!
猪也哄哄乱叫!

点评:

猫叫带动狗叫和猪叫~

例子不在于多复杂,在于能把概念阐述清晰。

看关系图

JAVA设计模式之【观察者模式】的更多相关文章

  1. 理解java设计模式之观察者模式

    在生活实际中,我们经常会遇到关注一个事物数据变化的情况,例如生活中的温度记录仪,当温度变化时,我们观察它温度变化的曲线,温度记录日志等.对于这一类问题,很接近java设计模式里面的“观察者模式”,它适 ...

  2. java设计模式之观察者模式以及在java中作用

    观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式.源-监听器(Source/Listener)模式或从属者(Dependen ...

  3. java设计模式02观察者模式

    观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 这里主要讲一下学习内置观察者的记录,在JA ...

  4. java设计模式之观察者模式

    观察者模式 观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式.模型-视图(View)模式.源-收听者(Listener)模式或从属者模式)是软件设计模式的一种.在此种模 ...

  5. JAVA设计模式 之 观察者模式

    简介: 观察者模式是JDK中最多的设计模式之一,非常有用,观察者模式介绍了一对多的依赖关系及松耦合,有了观察者,你将会消息灵通. 认识观察者模式,看一个报纸.杂志订阅是怎么回事: (1). 报社的业务 ...

  6. 折腾Java设计模式之观察者模式

    观察者模式 Define a one-to-many dependency between objects where a state change in one object results in ...

  7. JAVA设计模式之观察者模式 - Observer

    有趣的事情发生时,可千万别错过了!有一个模式可以帮你的对象知悉现况,不会错过该对象感兴趣的事.对象甚至在运行时可决定是否要继续被通知.有了观察者,你将会消息灵通. 介绍 观察者模式的定义: 在对象之间 ...

  8. JAVA设计模式 之 观察者模式(JDK内置实现)

    简介:使用JAVA内置的帮你搞定观察者模式. 1. 先把类图放在这里: (1). Observable类追踪所有的观察者,并通知他们. (2). Observer这个接口看起来很熟悉,它和我们之前写的 ...

  9. java设计模式之观察者模式(9)

    Java观察者模式的浅析 简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象.这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者 ...

  10. java设计模式:观察者模式

    package Observer; public class Test { /** * client测试类别 * 观察者模式一般由四部分组成: * 1摘要观察员(教科书被称为一般"Subje ...

随机推荐

  1. 初学ToggleButton 点击button,更换button背景图片;再次点击,恢复之前背景图

    上方的图标,R.drawable.register_checked  是选中图片 下方的图标,   R.drawable.register_unchecked 是未选中图片 默认是上方的选中效果.点击 ...

  2. 算法入门经典-第七章 例题7-4-1 拓展 n皇后问题 回溯法

    实际上回溯法有暴力破解的意思在里面,解决一个问题,一路走到底,路无法通,返回寻找另   一条路. 回溯法可以解决很多的问题,如:N皇后问题和迷宫问题. 一.概念 回溯算法实际类似枚举的搜索尝试过程,主 ...

  3. 让html页面不缓存js的实现方法

    很多朋友都会碰到这样的情况:如果我们页面加载了js的话下次打开时也会是调用这个js缓存文件,但对于我们调试时是非常的不方便了,本文就来谈论如何解决这一问题,下面一起来看看. 不缓存JS的方法其实挺简单 ...

  4. day16 闭包以及装饰器(好东西)

    目录 闭包 装饰器 最基础的装饰器 完善装饰器 有返回值的 有参数的 装饰器模版 语法糖 登录装饰器 可变类型的局部变量可以修改全局变量 三层装饰器 闭包 首先要理解函数对象的概念,其实函数名就相当于 ...

  5. nginx学习地址

    http://www.cnblogs.com/magicsoar/p/5817734.html

  6. JS中通过LayUI的layer.prompt弹出文本输入层,多个按钮回调获取输入值

    JS中通过LayUI弹出文本输入层,多个按钮回调: 如图所示,输入文本后点击通过/不通过按钮回调获取输入文本值的实现: 实现JS: layer.prompt({ formType: 2, // 弹出文 ...

  7. 使用Git--将本地项目提交到Github

    前置工作 1. 在GitHub官网注册一个GitHub账号: 2. 安装git工具,在Git官网下载对应版本的Git: 方法一: 1. 进入Github首页,点击New repository新建一个项 ...

  8. luogu 自适应Simpson2

    自适应simpson2 题意 求一个不定积分 解法 画出函数的图像,可以知道其在0处函数值趋近于 $ + \infty $,在10处趋近于0,所以我们从0积分到10就可以了(保险起见,积到15) 代码 ...

  9. EXGSBS模板

    EXBSGS模板 我之前把有一处b和c弄反了,有点困...然后调了半天 (exbsgs比excrt简单多了) 求x的最小正整数解 原式子拆成 在bsgs中,保证a,b互质,这样求出的逆元挪过去才对 但 ...

  10. BZOJ 3510 首都 (LCT)

    洛谷P4299传送门 题目大意:给你一颗树,边是一条一条连上去的 在连接过程中会存在询问,询问当前节点所在联通块(其实是一颗树)的重心是哪个节点 以及森林中所有树的重心的异或和 在做这道题之前,要先了 ...