(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. 三要素之间的关系:事件源注册事件监听器后,当事件源上发生某个动作时,事件源就会调用事件监听的一个方法,并将事件对 ...
随机推荐
- 【转】Xcode 7 真机调试详细步骤
原文网址:http://www.jianshu.com/p/fa5f90b61ad6 文/ldjhust(简书作者)原文链接:http://www.jianshu.com/p/fa5f90b61ad6 ...
- JS原型函数相关基础知识
函数对象和普通对象 //普通对象 var oo1 = {}, oo2 = new Object(), oo3 = []; console.log(typeof oo1 + ',' + typeof o ...
- Google Map API学习1
这一段时间公司一个新产品上线, 做超市代购的 这样,就需要计算每个门店也就是超市,距离小区之间的距离. 我们用的是Google Map 1.批量对地址进行编码,也就是将地址批量转化成对应的Goole ...
- Matlab与DSP联合开发
1.关于DSP开发环境 刚开始接触TI CCS的时候,用的是CCS2.2,当时CCS2.2又分成4个系列安装包 1.CCS6000 2.CCS5000 3.CCS2000 4.OMAP 都可以单独安装 ...
- EasyWebServer编写CGI程序的环境变量
示例: SERVER_SOFTWARE=EasyWebServer/1.9 SERVER_PROTOCOL=HTTP/1.1 SERVER_PORT= SERVER_NAME=aozima-noteb ...
- GDI+ —— Tcanvas 类属性及方法.......
delphi TCanvas类 类关系 TObject-> TPersistent 对那些作图对象,可使用TCanvas对象作为画布.标准的window控件,例如编辑控件和列表框控件,当 ...
- BCTF赛后
今天早上八点,BTCF第一届落幕.虽然没有熬夜coding但还是十分开心. 从收到超哥的邀请,到回头组队,一开始的十几人,最后演化为五人的精简小分队,到昨晚把所有有想法的题目全部搞定,十分的开心和欣慰 ...
- hdu 4284 状态压缩
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4284 #include<cstdio> #include<cstring> # ...
- rnqoj-73-展演队型-dp
纯属于敢想就敢做的题目,列出来状态转移就OK了 #include<stdio.h> #include<string.h> #include<iostream> #i ...
- 关于平移的 scrollTo和scrollBy的区别
这几天在项目中要求一部分布局实现整体偏移的效果 在网上查了下我使用来ScrollBy(x,y)方法 他的意思是将view实现整体偏移 而ScollTo(x,y)则是将原点偏移到相应指定的位置即 移 ...