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 ...
随机推荐
- FFMpeg在Windows下搭建开发环境【转】
本文转载自:http://blog.csdn.net/wootengxjj/article/details/51758621 版权声明:本文为博主原创文章,未经博主允许不得转载. FFmpeg 是一个 ...
- [Tomcat]Tomcat6和Tomcat7的区别
Tomcat 7最大的改进是对Servlet 3.0和Java EE 6的支持.◆Tomcat 7完全支持Servlet 3.0规范◆Tomcat 7新增了对Java注释的支持◆Tomcat 7通过w ...
- js写发布微博文本框---2017-04-14
实现效果: 1.文本框输入内容,低端字数对应减少 2.当文本框内容超出时,会显示字数超出多少 效果图如下: 实现代码: <!DOCTYPE html><html> <he ...
- Memcache使用场景
session //php文件中 ini_set("session.save_handler", "memcache"); ini_set("sess ...
- SpringBoot(八) Spring和消息队列RabbitMQ
概述 1.大多数应用中,可以通过消息服务中间件来提升系统异步能力和拓展解耦能力. 2.消息服务中的两个重要概念:消息代理(Message broker)和目的地(destination) 当消息发送者 ...
- 洛谷P4015 运输问题(费用流)
题目描述 WW 公司有 mm 个仓库和 nn 个零售商店.第 ii 个仓库有 a_iai 个单位的货物:第 jj 个零售商店需要 b_jbj 个单位的货物. 货物供需平衡,即\sum\limits ...
- JS 限制input框的输入字数,并提示可输入字数
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- UVa 11520 Fill in the Square
题意:给出 n*n的格子,把剩下的格子填上大写字母,使得任意两个相邻的格子的字母不同,且从上到下,从左到右的字典序最小 从A到Z枚举每个格子填哪一个字母,再判断是否合法 #include<ios ...
- struct和class两个关键字的区别
1. <C++ Primer> 用class和struct关键字定义类的唯一差别在于默认访问级别:默认情况下,struct的成员为public,而class的成员为private. 2. ...
- jtable的用法
一.创建表格控件的各种方式:1) 调用无参构造函数.JTable table = new JTable();2) 以表头和表数据创建表格.Object[][] cellData = {{" ...