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 ...
随机推荐
- .net mvc Model 验证总结
ASP.NET MVC4中的Model是自验证的,这是通过.NET4的System.ComponentModel.DataAnnotations命名空间完毕的. 我们要做的仅仅是给Model类的各属性 ...
- IOS之UITableView——怎样刷新父页面的Cell
问题:评论数同步 在社交相关的项目中常常有这种主页面,主列表的Cell中有赞数.评论数,详情页顶部也是相同的一个Cell,下部有评论列表,评论添加或降低.详情页的评论数随之改变,返回主列表,主列表的相 ...
- Android UI 优化 使用<include/>和 <merge />标签
使用<include /> 标签来重用layout代码 如果在一个项目中需要用到相同的布局设计,可以通过<include /> 标签来重用layout代码,该标签在Androi ...
- 英语发音规则---P字母
英语发音规则---P字母 一.总结 一句话总结: 1.P发[p]音? paper ['peɪpə] n. 纸 plane [pleɪn] n. 飞机 pig [pɪg] n. 猪 ship [ʃɪp] ...
- php面向对象之__isset和__unset
php面向对象之__isset和__unset 一.简介 __isset和__unset都是对不可访问属性的操作,前者是检验的时候自动调用,后者是销毁的时候自动调用. 比如说在类外访问private的 ...
- mysqli一些常用方法及详解
mysqli一些常用方法及详解 1.die()函数:表示向用户输出引号中的内容后,程序终止运行,提示定制的出错信息 ex: $conn = mysqli_connect("localhost ...
- caffe:使用C++来提取任意一张图片的特征
0x00 关于使用C++接口来提取特征,caffe官方提供了一个extract_features.cpp的例程,但是这个文件的输入是blob数据,即使输入层使用的是ImageData,也需要在depl ...
- 信息安全-加密:MD5
ylbtech-信息安全-加密:MD5 MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值( ...
- PHP中出现Notice: Undefined index的三种解决办法
前一段做的一个PHP程序在服务器运行正常,被别人拿到本机测试的时候总是出现“Notice: Undefined index:”这样的警告,这只是一个因为PHP版本不同而产生的警告(NOTICE或者WA ...
- 转:如何在Ubuntu 14.04中安装最新版Eclipse
想必很多开发人员都知道,Ubuntu 软件源中提供的并不是最新版本的 Eclipse,本教程就教大家如何在 Ubuntu 14.04 中快速安装 Eclipse 官方发布的最新版本. 到目前为止,Ec ...