JAVA设计模式之【观察者模式】
观察者模式
交通信号灯是汽车的观察目标,汽车是观察者
一个对象的状态或行为的变化将导致其他对象的状态或行为也发生变化
为了描述这种一对多或一对一的联动,观察者模式应运而生
在观察者模式中,发生改变的对象成为观察目标,而被通知的对象成为观察者。一个观察目标可以对应多个观察者。
别名
发布与订阅模式
模型与视图模式
源监听模式
从属者模式
角色
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设计模式之【观察者模式】的更多相关文章
- 理解java设计模式之观察者模式
在生活实际中,我们经常会遇到关注一个事物数据变化的情况,例如生活中的温度记录仪,当温度变化时,我们观察它温度变化的曲线,温度记录日志等.对于这一类问题,很接近java设计模式里面的“观察者模式”,它适 ...
- java设计模式之观察者模式以及在java中作用
观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式.源-监听器(Source/Listener)模式或从属者(Dependen ...
- java设计模式02观察者模式
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 这里主要讲一下学习内置观察者的记录,在JA ...
- java设计模式之观察者模式
观察者模式 观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式.模型-视图(View)模式.源-收听者(Listener)模式或从属者模式)是软件设计模式的一种.在此种模 ...
- JAVA设计模式 之 观察者模式
简介: 观察者模式是JDK中最多的设计模式之一,非常有用,观察者模式介绍了一对多的依赖关系及松耦合,有了观察者,你将会消息灵通. 认识观察者模式,看一个报纸.杂志订阅是怎么回事: (1). 报社的业务 ...
- 折腾Java设计模式之观察者模式
观察者模式 Define a one-to-many dependency between objects where a state change in one object results in ...
- JAVA设计模式之观察者模式 - Observer
有趣的事情发生时,可千万别错过了!有一个模式可以帮你的对象知悉现况,不会错过该对象感兴趣的事.对象甚至在运行时可决定是否要继续被通知.有了观察者,你将会消息灵通. 介绍 观察者模式的定义: 在对象之间 ...
- JAVA设计模式 之 观察者模式(JDK内置实现)
简介:使用JAVA内置的帮你搞定观察者模式. 1. 先把类图放在这里: (1). Observable类追踪所有的观察者,并通知他们. (2). Observer这个接口看起来很熟悉,它和我们之前写的 ...
- java设计模式之观察者模式(9)
Java观察者模式的浅析 简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象.这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者 ...
- java设计模式:观察者模式
package Observer; public class Test { /** * client测试类别 * 观察者模式一般由四部分组成: * 1摘要观察员(教科书被称为一般"Subje ...
随机推荐
- python 从bulkblacklist信誉查询网站提交查询
import urllib import urllib2 #import webbrowser import re import socket def is_domain_in_black_list( ...
- JSP页面动态查询添加数据与分页数据显示
1 . <%@ page language="java" contentType="text/html; charset=UTF-8"%> < ...
- POJ 1471 模拟?
题意:求最大无坏点三角形 思路: 模拟? (为什么我模拟过了...) 有人用 DP,有人用 搜索... // by SiriusRen #include <cstdio> #include ...
- C语言中以文本方式读写文件时换行符转换的注意事项
我们知道在UNIX下是没有回车符(\r)的,只有换行符(\n),而C语言诞生于UNIX(Linux即面向开源的UNIX,Mac OS也是UNIX发展而来的,而Windows是从MS-DOS发展而来,与 ...
- js复制克隆
$(function() {//开始加载updateIndex()}) function add(){ var str = $(".tr_wqxx").first().clone( ...
- (转载)Android项目实战(二十七):数据交互(信息编辑)填写总结
Android项目实战(二十七):数据交互(信息编辑)填写总结 前言: 项目中必定用到的数据填写需求.比如修改用户名的文字编辑对话框,修改生日的日期选择对话框等等.现总结一下,方便以后使用. 注: ...
- 火狐浏览器下载文件中文乱码,文件名中的空格变加号("+")的问题
解决一下问题: 1.火狐浏览器下载文件,中文变乱码 2.IE浏览器下载文件,丢失文件扩展名或强制扩展名为".txt" 3.浏览器下载文件,文件名中的空格变成加号("+&q ...
- BZOJ 2806 [Ctsc2012]Cheat (后缀自动机+二分+单调队列+dp)
题目大意: 给你一堆模式串和文本串 对于每个文本串,我们可以把它不可重叠地拆分成很多子串,如果拆分出的串作为子串出现在了任何一个模式串中,我们称它是“眼熟的”,我们必须保证“眼熟的”子串总长度不小于文 ...
- Python中的itertools.product
例子1:import itertoolsa = itertools.product([1,2,3],[100,200])print(a)for item in itertools.product([1 ...
- ItChat与图灵机器人的结合
前景: 我在知乎关注一位大佬 名字叫 LittleCoder 我是在他开发ItChat包时关注的 ItChat已经完成了微信的个人账号的API接口 已经实现了实时获取用户的即时信息并自动化进行回应 后 ...