(java)从零开始之--观察者设计模式Observer
观察者设计模式:时当一个对象发生指定的动作时,要通过另外的对象做出相应的处理。
步骤:
1. A对象发生指定的动作是,要通知B,C,D...对象做出相应的处理,这时候应该把B,C,D...对象针对A对象的动作做出的相应处理方法定义在接口上(这是一种规范,凡事需要A对象通知的对象,都要实现该接口)。
2. 在A对象维护接口的引用,当A对象发生指定的动作这时候即可调用接口中的方法。
观察者模式的应用场景:
1. 对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。
2.对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。
假设有一个例子:
气象台每天都会更新天气预报,订阅的人群都可以在每次气象台发布天气预报,都可以接收到天气预报信息.订阅人群可以根据天气预报信息做出相应处理
被观察对象(Subject)
/*
* 气象台类
*
*/
public class WeatherStation { private String[] weatherArr = {"大雨","大雪","台风","雾霾","多云","晴"};
private String weatherDesc = weatherArr[0];
private ArrayList<IWeather> list = new ArrayList<IWeather>(); //对外提供一个方法添加天气预报更新时,要通知的对象
public void add(IWeather weather){
this.list.add(weather);
} //对外提供一个方法取消订阅天气预报
public void remove(IWeather weather){
if(weatherArr.length>0){
for (int i = 0; i < weatherArr.length; i++) {
if(list.get(i).equals(weather)){
this.list.remove(i);
break;
}
} }
} //开始天气预报
public void startWeatherForecast(){
new Thread(){
@Override
public void run() {
while(true){
updateWeather();//每3秒钟更新一次天气预报 (模拟每天气象台自动更新天气预报)
for (IWeather weather : list) {
weather.updateWeather(weatherDesc);
}
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
} }
}
}.start(); } //气象台更新天气
public void updateWeather(){
Random random = new Random();
int n = random.nextInt(weatherArr.length);
this.weatherDesc = weatherArr[n];
System.out.println("气象台发布天气预报:"+this.weatherDesc);
} }
所有订阅的群体必须具有一个共同updateWeather的方法(实现该接口),这样气象台发布新天气预报时候,即可通过调用订阅对象执行该方法,达到通知目的。
/*
* 一个接口规范,实现了该接口对象所要做的动作。
* 实现该接口的对象当气象台天气预报更新时执行
* {"大雨","大雪","台风","雾霾","多云","晴"}
*/
public interface IWeather {
public void updateWeather(String weatherDesc);
}
订阅的群体类 观察者对象Observer
/*
* 可能订阅群个之一,工作者
*
*/
public class Emp implements IWeather { String name;
int age; public Emp(String name, int age) {
this.name = name;
this.age = age;
} //{"大雨","大雪","台风","雾霾","多云","晴"}
@Override
public void updateWeather(String weatherDesc) {
System.out.println(this.name+":收到天气预报 "+weatherDesc);
}
}
-
/*
* 可能订阅群体之一, 学生
*/
public class Student implements IWeather { String name;
int age; public Student(String name, int age) {
this.name = name;
this.age = age;
} //{"大雨","大雪","台风","雾霾","多云","晴"}
@Override
public void updateWeather(String weatherDesc) {
System.out.println(this.name+":收到天气预报 "+weatherDesc);
} }
Main、
public class WeatherMain {
public static void main(String[] args) {
WeatherStation weatherStation = new WeatherStation();
Student s1 = new Student("小明", 10);
Student s2 = new Student("小美", 10);
Emp e1 = new Emp("大明", 10);
Emp e2 = new Emp("大美", 10);
weatherStation.add(s1);
weatherStation.add(s2);
weatherStation.add(e1);
weatherStation.add(e2);
weatherStation.remove(e2);
weatherStation.startWeatherForecast();
}
}
因为“大美”取消了天气预报,所以没有收到天气预报通知
执行结果:
气象台发布天气预报:大雪
小明:收到天气预报 大雪
小美:收到天气预报 大雪
大明:收到天气预报 大雪
气象台发布天气预报:雾霾
小明:收到天气预报 雾霾
小美:收到天气预报 雾霾
大明:收到天气预报 雾霾
气象台发布天气预报:台风
小明:收到天气预报 台风
小美:收到天气预报 台风
大明:收到天气预报 台风
气象台发布天气预报:晴
小明:收到天气预报 晴
小美:收到天气预报 晴
大明:收到天气预报 晴
气象台发布天气预报:雾霾
小明:收到天气预报 雾霾
小美:收到天气预报 雾霾
大明:收到天气预报 雾霾
...
(java)从零开始之--观察者设计模式Observer的更多相关文章
- Java常用类库——观察者设计模式
观察者设计模式 现在很多的购房者都在关注着房子的价格变化,每当房子价格变化的时候,所有的购房者都可以观察得到.实际上以上的购房者都属于观察者,他们都关注着房子的价格. 如果要想实现观察者模式,则必须依 ...
- Java常用类库--观察者设计模式( Observable类Observer接口)
如果要想实现观察者模式,则必须依靠java.util包中提供的Observable类和Observer接口. import java.util.* ; class House extends Obse ...
- java学习之观察者设计模式
package com.gh.observer; import java.util.Observable; /** * 被观察者对象 * 必须继承被观察者抽象类 * @author ganhang * ...
- 设计模式:观察者(Observer)模式
设计模式:观察者(Observer)模式 一.前言 观察者模式其实最好的名称应该是“发布订阅”模式,和我们现在大数据之中的发布订阅方式比较类似,但是也有区别的地方,在上一个设计模式,我们学习的是仲 ...
- Observer模式(观察者设计模式)
Observer 设计模式? 在Observer模式中,当观察对象的状态发生变化时,会通知给观察者.Observer模式适用于根据对象状态进行相应处理的场景. Observer 并非主动观察,而是被动 ...
- 设计模式的征途—15.观察者(Observer)模式
在日常生活中,交通信号灯指挥者日益拥挤的城市交通.红灯亮,汽车停止:绿灯亮,汽车继续前行:在这个过程中,交通信号灯是汽车的观察目标,而汽车则是观察者.随着交通信号灯的变化,汽车的行为也会随之变化,一盏 ...
- java: 观察者模式:Observable被观察者,Observer观察者
java: 观察者模式:Observable被观察者,Observer观察者 以房子价格为例,卖房者为被观察者: import java.util.Observable; //被观察者子类化 publ ...
- Java 设计模式 – Observer 观察者模式
目录 [隐藏] 1 代码 1.1 观察者接口: 1.2 被观察者: 1.3 观众类 : 1.4 电影类: 1.5 效果如下: 代码 说明都在注释: 观察者接口: package ObserverMod ...
- Java事件监听机制与观察者设计模式
一. Java事件监听机制 1. 事件监听三要素: 事件源,事件对象,事件监听器 2. 三要素之间的关系:事件源注册事件监听器后,当事件源上发生某个动作时,事件源就会调用事件监听的一个方法,并将事件对 ...
随机推荐
- 【POJ】1451 T9
DFS+字典树. #include <cstdio> #include <cstring> #include <cstdlib> typedef struct Tr ...
- 2015第45周五IE11实用开发工具摘录及设置IE缓存
UI响应工具的作用 UI响应工具顾名思义就是查看UI响应时间的工具,通过这个工具可以帮助我们确定应用中的哪些组件占用了多少CPU时间,让我们之后可以更有针对性的进行优化,从而最大限度地改善应用性能,同 ...
- Linux学习笔记23——取消线程
一 相关函数 1 发送终止信号 #include <pthread.h> int pthread_cancel(pthread_t thread); 2 设置取消状态 #include & ...
- 从Java视角理解CPU上下文切换(Context Switch)
从Java视角理解系统结构连载, 关注我的微博(链接)了解最新动态 在高性能编程时,经常接触到多线程. 起初我们的理解是, 多个线程并行地执行总比单个线程要快, 就像多个人一起干活总比一个人干要快 ...
- Xcode7.1与iOS9之坑
一.更改http为https 两种方案: 公司后台服务器更改; 作为开发者,可在Xcode暂时退回到http协议. 开发者更改方法如下: 在Info.plist中添加App Transport Se ...
- MongoDB Java 连接配置
[前言] 由于处于线程安全等考虑,MongoDBJava从3.0开始已经打算废弃DB开头的类的使用,所以整体调用上有了较大的区别,特以此文志之 [正文] 环境配置 在Java程序中如果要使用Mongo ...
- ELK Packetbeat 部署指南(15th)
原文链接:http://www.ttlsa.com/elk/elk-packetbeat-deployment-guide/ Packetbeat 是一个实时网络数据包分析工具,与elasticsea ...
- java.lang.ClassCastException: Ljava.lang.Object; cannot be cast to com.entity.Advertisem异常
今天一不小心就碰到了这样的问题,以前从来没有碰到过,在网上搜了很多办法,思路正确,但是还是要根据自己的程序改变. 一开始写的是hql语句进行统计每个月的数据,但是试了很久,程序一直提醒hql语句异常, ...
- oracle正则截取字符串的函数
现在有这么一个需求, 数据库中的一个手输的'籍贯'字段,要按一定的规范截取显示在报表上,比如,如果'籍贯'的内容是:'山东省潍坊市昌乐县', 那么报表里要显示为:'山东昌乐', 如果'籍贯'是山东省潍 ...
- hdu 4911 Inversion(归并排序求逆序对数)2014多校训练第5场
Inversion Time Limit: 20 ...