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

步骤:
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. iOS 多线程学习笔记 —— NSOperation

    本文复制.参考自文章:iOS多线程编程之NSOperation和NSOperationQueue的使用 ,主要为了加强个人对知识的理解和记忆,不做他用.原作者声明: 著作权声明:本文由http://b ...

  2. HDOJ/HDU 2537 8球胜负(水题.简单的判断)

    Problem Description 8球是一种台球竞赛的规则.台面上有7个红球.7个黄球以及一个黑球,当然还有一个白球.对于本题,我们使用如下的简化规则:红.黄两名选手轮流用白球击打各自颜色的球, ...

  3. lightoj 1033 区间dp

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1033 #include <cstdio> #include <cst ...

  4. 银联手机支付(.Net Csharp),3DES加密解密,RSA加密解密,RSA私钥加密公钥解密,.Net RSA 3DES C#

    前段时间做的银联支付,折腾了好久,拼凑的一些代码,有需要的朋友可以参考,本人.Net新手,不保证准确性! 这个银联手机支付没有SDK提供,技术支持也没有.Net的,真心不好搞! RSA加解密,这里有个 ...

  5. mac 别名 ll

    在 Linux 下习惯使用 ll.la.l 等ls别名的童鞋到 mac os 可就郁闷了~~ 其实只要在用户目录下建立一个脚本“.bash_profile”, vim .bash_profile 并输 ...

  6. js判断input输入框为空时遇到的问题 弹窗后,光标没有定位到输入框,而是直接执行我的处理页面程序

    无论是会员注册还是提交订单,我们都要使用到form表单,此时我们在处理数据时,就要判断用户填写的信息.一次是直接通过js判断input输入框是否没有填信息,然后在后台处理文件中通过过滤字符串后再次判断 ...

  7. 【iOS】iOS之Button segue弹出popOver消除(dismiss)问题

    如图.由于程序须要,点击Button Ctrl+Dragging加入了一个UITableViewController,当然其余的Controller也能够,这样我们在方法 -(void)prepare ...

  8. 使用jsdoc-toolkit来自动生成js api文档

    近来前端组小盆友开发的类库越来越多,很多情况下彼此不知道写了些什么方法,为了更好的合作提高工作效率,找了个比较好的api文档生成方法.使用jsdoc-toolkit来自动生成js api文档. 一.  ...

  9. 动态设置布局LayoutInflater

    LayoutInflater作用是将layout的xml布局文件实例化为View类对象.LayoutInflater 的作用类似于 findViewById(),不同点是LayoutInflater是 ...

  10. android 33 对话框控件

    对话框控件:最多3个按钮. mainActivity.java package com.sxt.day05_09; import android.app.Activity; import androi ...