观察者设计模式:时当一个对象发生指定的动作时,要通过另外的对象做出相应的处理。

步骤:
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的更多相关文章

  1. Java常用类库——观察者设计模式

    观察者设计模式 现在很多的购房者都在关注着房子的价格变化,每当房子价格变化的时候,所有的购房者都可以观察得到.实际上以上的购房者都属于观察者,他们都关注着房子的价格. 如果要想实现观察者模式,则必须依 ...

  2. Java常用类库--观察者设计模式( Observable类Observer接口)

    如果要想实现观察者模式,则必须依靠java.util包中提供的Observable类和Observer接口. import java.util.* ; class House extends Obse ...

  3. java学习之观察者设计模式

    package com.gh.observer; import java.util.Observable; /** * 被观察者对象 * 必须继承被观察者抽象类 * @author ganhang * ...

  4. 设计模式:观察者(Observer)模式

    设计模式:观察者(Observer)模式 一.前言   观察者模式其实最好的名称应该是“发布订阅”模式,和我们现在大数据之中的发布订阅方式比较类似,但是也有区别的地方,在上一个设计模式,我们学习的是仲 ...

  5. Observer模式(观察者设计模式)

    Observer 设计模式? 在Observer模式中,当观察对象的状态发生变化时,会通知给观察者.Observer模式适用于根据对象状态进行相应处理的场景. Observer 并非主动观察,而是被动 ...

  6. 设计模式的征途—15.观察者(Observer)模式

    在日常生活中,交通信号灯指挥者日益拥挤的城市交通.红灯亮,汽车停止:绿灯亮,汽车继续前行:在这个过程中,交通信号灯是汽车的观察目标,而汽车则是观察者.随着交通信号灯的变化,汽车的行为也会随之变化,一盏 ...

  7. java: 观察者模式:Observable被观察者,Observer观察者

    java: 观察者模式:Observable被观察者,Observer观察者 以房子价格为例,卖房者为被观察者: import java.util.Observable; //被观察者子类化 publ ...

  8. Java 设计模式 – Observer 观察者模式

    目录 [隐藏] 1 代码 1.1 观察者接口: 1.2 被观察者: 1.3 观众类 : 1.4 电影类: 1.5 效果如下: 代码 说明都在注释: 观察者接口: package ObserverMod ...

  9. Java事件监听机制与观察者设计模式

    一. Java事件监听机制 1. 事件监听三要素: 事件源,事件对象,事件监听器 2. 三要素之间的关系:事件源注册事件监听器后,当事件源上发生某个动作时,事件源就会调用事件监听的一个方法,并将事件对 ...

随机推荐

  1. configure: error: cannot find protoc, the Protocol Buffers compiler

    centos 6 安装mosh 1.2 2012-05-07 17:21:41标签:centos mosh 关于mosh(引用于) 芬兰研究员Tatu Ylönen于1995年设计出最早的SSH协议, ...

  2. CSS3 :nth-of-type() 选择器

    可以设定第几个元素的样式 案例 css .qrcode img { margin-top: 30px; } .qrcode p:nth-of-type(1) { /*第一个p*/ font-size: ...

  3. [FJSC2014]折线统计

    [题目描述] 二维平面上有n 个点(xi, yi),现在这些点中取若干点构成一个集合S,对它们按照x 坐标排序,顺次连接,将会构成一些连续上升.下降的折线,设其数量为f(S).如下图中,1->2 ...

  4. Unity3d 屏幕空间人体皮肤知觉渲染&次表面散射Screen-Space Perceptual Rendering & Subsurface Scattering of Human Skin

    之前的人皮渲染相关 前篇1:unity3d Human skin real time rendering 真实模拟人皮实时渲染 前篇2:unity3d Human skin real time ren ...

  5. MySQL查询过程中出现lost connection to mysql server during query 的解决办法

    window7 64位系统,MySQL5.7 问题:在使用shell进行数据表更新操作的过程,输入以下查询语句: ,; 被查询的表记录数达到500W条,在查询过程中出现如题目所示的问题,提示" ...

  6. python之json学习

    1. 从python原始类型向json类型的转换过程,具体的转换如下: import json json.dump(obj, fp, skipkeys=False,ensure_ascii=True, ...

  7. CMDLINE的解析

    在linux的config文件中有一个特殊的宏定义CMDLINE,以前也一直在使用这个宏的参数,但是真正这个宏的解析和使用却不怎么明确.这次有机会多对它有些了解,不妨把这个浅显的认识说出来,记下来. ...

  8. 【转】PHP获取当前时间、时间戳的各种格式写法汇总[日期时间]

    今天写下php中,如何通过各种方法 获取当前系统时间.时间戳,并备注各种格式的含义,可灵活变通.1.获取当前时间方法date()很简单,这就是获取时间的方法,格式为:date($format, $ti ...

  9. Myeclipse2013 SVN安装方法

    1. 打开Help下的Install from Site 2. 弹出窗口,如下图: 3. 点击Add标签,如图: 在对话框Name输入Svn, URL中输入:http://subclipse.tigr ...

  10. Secant Method (Website)

    Secant Method:  https://www.youtube.com/watch?v=qC9xnsfOd30 Secant Method : http://mathworld.wolfram ...