目录


问题

程序模拟

版本一:while死循环

版本二:面向对象式地傻等

版本三:加入观察者

版本四:加入多个观察者

版本五:分离观察者与被观察者

版本六:观察者根据事件来作出处理

版本七:处理事件需要事件源对象

版本八:事件形成继承体系

java.awt.Frame类应用观察者模式


reactor模型的本质就是观察者模式。

问题

首先来看一个问题:

程序模拟

版本一:while死循环

程序模拟小孩哭:一个死循环等着,当cry为true时就执行。类似于面向过程式地傻等

/*** 披着面向对象外衣的面向过程*/public class Main1 {public static void main(String[] args) {boolean cry = false;while(!cry) {//进行处理}}
}

版本二:面向对象式地傻等

抽象出一个Child类来,提供一个wakeUp()方法和一个cry属性。本质上同版本一没区别,只不过用了面向对象的思想。

/*** 面向对象的傻等*/class Child {private boolean cry = false;public boolean isCry() {return cry;}public void wakeUp() {System.out.println("Waked Up! Crying wuwuwuwu...");cry = true;}
}public class Main {public static void main(String[] args) {Child child = new Child();while(!child.isCry()) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("observing...");}}
}

版本三:加入观察者

加入观察者Dad。当Child的wakeUp()了之后就调用Dad的feed()方法

/*** 加入观察者*/class Child {private boolean cry = false;private Dad d = new Dad();public boolean isCry() {return cry;}public void wakeUp() {cry = true;d.feed();}
}class Dad {public void feed() {System.out.println("dad feeding...");}
}public class Main {public static void main(String[] args) {Child c = new Child();//do sthc.wakeUp();}
}

版本四:加入多个观察者

/*** 加入多个观察者*/class Child {private boolean cry = false;private Dad dad = new Dad();private Mum mum = new Mum();private Dog dog = new Dog();public boolean isCry() {return cry;}public void wakeUp() {cry = true;dad.feed();dog.wang();mum.hug();}
}class Dad {public void feed() {System.out.println("dad feeding...");}
}class Mum {public void hug() {System.out.println("mum hugging...");}
}class Dog {public void wang() {System.out.println("dog wang...");}
}public class Main {public static void main(String[] args) {Child c = new Child();//do sthc.wakeUp();}
}

版本五:分离观察者与被观察者

定义一个观察者接口Observer,提供一个actionOnWakeUp()方法供观察者实现。

/*** 分离观察者与被观察者*/class Child {private boolean cry = false;private List<Observer> observers = new ArrayList<>();{observers.add(new Dad());observers.add(new Mum());observers.add(new Dog());}public boolean isCry() {return cry;}public void wakeUp() {cry = true;for(Observer o : observers) {o.actionOnWakeUp();}}
}interface Observer {void actionOnWakeUp();
}class Dad implements Observer {public void feed() {System.out.println("dad feeding...");}@Overridepublic void actionOnWakeUp() {feed();}
}class Mum implements Observer {public void hug() {System.out.println("mum hugging...");}@Overridepublic void actionOnWakeUp() {hug();}
}class Dog implements Observer {public void wang() {System.out.println("dog wang...");}@Overridepublic void actionOnWakeUp() {wang();}
}public class Main {public static void main(String[] args) {Child c = new Child();//do sthc.wakeUp();}
}

版本六:观察者根据事件来作出处理

有很多时候,观察者需要根据事件的具体情况来进行处理。

①Source--事件源对象

②Observer--观察者(监听者)

③Event--事件对象

事件源对象Source会发出一些事件Event,Observer观察者观察到这些事件后作出一系列的反应。

比如键盘监听对象MyKeyListener extends KeyAdapter,事件源对象就是窗口Frame,事件对象是KeyEvent,观察者(监听器)是MykeyListener。

import java.util.ArrayList;
import java.util.List;/*** 有很多时候,观察者需要根据事件的具体情况来进行处理*/class Child {private boolean cry = false;private List<Observer> observers = new ArrayList<>();{observers.add(new Dad());observers.add(new Mum());observers.add(new Dog());}public boolean isCry() {return cry;}public void wakeUp() {cry = true;wakeUpEvent event = new wakeUpEvent(System.currentTimeMillis(), "bed");for(Observer o : observers) {o.actionOnWakeUp(event);}}
}//事件类 fire Event
class wakeUpEvent{long timestamp;String loc;public wakeUpEvent(long timestamp, String loc) {this.timestamp = timestamp;this.loc = loc;}
}interface Observer {void actionOnWakeUp(wakeUpEvent event);
}class Dad implements Observer {public void feed() {System.out.println("dad feeding...");}@Overridepublic void actionOnWakeUp(wakeUpEvent event) {feed();}
}class Mum implements Observer {public void hug() {System.out.println("mum hugging...");}@Overridepublic void actionOnWakeUp(wakeUpEvent event) {hug();}
}class Dog implements Observer {public void wang() {System.out.println("dog wang...");}@Overridepublic void actionOnWakeUp(wakeUpEvent event) {wang();}
}public class Main {public static void main(String[] args) {Child c = new Child();//do sthc.wakeUp();}
}

版本七:处理事件需要事件源对象

* 有很多时候,观察者需要根据事件的具体情况来进行处理
 * 大多数时候,我们处理事件的时候,需要事件源对象

import java.util.ArrayList;
import java.util.List;/*** 有很多时候,观察者需要根据事件的具体情况来进行处理* 大多数时候,我们处理事件的时候,需要事件源对象*/class Child {private boolean cry = false;private List<Observer> observers = new ArrayList<>();{observers.add(new Dad());observers.add(new Mum());observers.add(new Dog());}public boolean isCry() {return cry;}public void wakeUp() {cry = true;wakeUpEvent event = new wakeUpEvent(System.currentTimeMillis(), "bed", this);for(Observer o : observers) {o.actionOnWakeUp(event);}}
}class wakeUpEvent{long timestamp;String loc;Child source;public wakeUpEvent(long timestamp, String loc, Child source) {this.timestamp = timestamp;this.loc = loc;this.source = source;}
}interface Observer {void actionOnWakeUp(wakeUpEvent event);
}class Dad implements Observer {public void feed() {System.out.println("dad feeding...");}@Overridepublic void actionOnWakeUp(wakeUpEvent event) {feed();}
}class Mum implements Observer {public void hug() {System.out.println("mum hugging...");}@Overridepublic void actionOnWakeUp(wakeUpEvent event) {hug();}
}class Dog implements Observer {public void wang() {System.out.println("dog wang...");}@Overridepublic void actionOnWakeUp(wakeUpEvent event) {wang();}
}public class Main {public static void main(String[] args) {Child c = new Child();//do sthc.wakeUp();}
}

版本八:事件形成继承体系

* 有很多时候,观察者需要根据事件的具体情况来进行处理
 * 大多数时候,我们处理事件的时候,需要事件源对象
 * 事件也可以形成继承体系

import java.util.ArrayList;
import java.util.List;/*** 有很多时候,观察者需要根据事件的具体情况来进行处理* 大多数时候,我们处理事件的时候,需要事件源对象* 事件也可以形成继承体系*/class Child {private boolean cry = false;private List<Observer> observers = new ArrayList<>();{observers.add(new Dad());observers.add(new Mum());observers.add(new Dog());}public boolean isCry() {return cry;}public void wakeUp() {cry = true;wakeUpEvent event = new wakeUpEvent(System.currentTimeMillis(), "bed", this);for(Observer o : observers) {o.actionOnWakeUp(event);}}
}abstract class Event<T> {abstract T getSource();
}class wakeUpEvent extends Event<Child>{long timestamp;String loc;Child source;public wakeUpEvent(long timestamp, String loc, Child source) {this.timestamp = timestamp;this.loc = loc;this.source = source;}@OverrideChild getSource() {return source;}
}interface Observer {void actionOnWakeUp(wakeUpEvent event);
}class Dad implements Observer {public void feed() {System.out.println("dad feeding...");}@Overridepublic void actionOnWakeUp(wakeUpEvent event) {feed();}
}class Mum implements Observer {public void hug() {System.out.println("mum hugging...");}@Overridepublic void actionOnWakeUp(wakeUpEvent event) {hug();}
}class Dog implements Observer {public void wang() {System.out.println("dog wang...");}@Overridepublic void actionOnWakeUp(wakeUpEvent event) {wang();}
}public class Main {public static void main(String[] args) {Child c = new Child();//do sthc.wakeUp();}
}

java.awt.Frame类应用观察者模式

import java.awt.Button;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class TestFrame extends Frame {public void launch() {Button b = new Button("press me");b.addActionListener(new MyActionListener());b.addActionListener(new MyActionListener2());this.add(b);this.pack();this.addWindowListener(new WindowAdapter(){@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});this.setLocation(400, 400);this.setVisible(true);}public static void main(String[] args) {new TestFrame().launch();}private class MyActionListener implements ActionListener { //Observerpublic void actionPerformed(ActionEvent e) {((Button)e.getSource()).setLabel("press me again!");System.out.println("button pressed!");}}private class MyActionListener2 implements ActionListener {public void actionPerformed(ActionEvent e) {System.out.println("button pressed 2!");}}
}

Observer观察者设计模式相关推荐

  1. 设计模式: 自己手动实现一个观察者设计模式

    观察者模式: 定义了对象之间的一对多依赖,这样一来.当一个对象(被观察者)改变状态时,它的全部依赖者(观察者)都会收到通知并自己主动更新. 在观察者模式中,会改变的是主题的状态,以及观察者的数目和类型 ...

  2. 简单的对象监听器 观察者设计模式

    该代码实现了一个可以注册监听类的类,如果注册了监听类,那么在类的一个方法执行前会执行监听类的方法.并且该监听类方法的参数就是被监听对象. 监听类就是事件监听器,被监听对象就是事件源,事件监听器的参数就 ...

  3. 常用的设计模式——观察者设计模式?和发布者-订阅者设计模式的区别

    1. 观察者设计模式 观察者把自己"绑定"至目标,当目标发生变化时,目标"通知"观察者,然后观察者进行相应操作.你有没有觉得这种设计模式更像发布-订阅设计模式? ...

  4. 《Head First设计模式》批注系列(一)——观察者设计模式

    最近在读<Head First设计模式>一书,此系列会引用源书内容,但文章内容会更加直接,以及加入一些自己的理解. 观察者模式(有时又被称为模型-视图(View)模式.源-收听者(List ...

  5. java观察者设计模式_Java中的观察者设计模式

    java观察者设计模式 在本教程中,我们将讨论Observer设计模式. 观察者模式有两个主要方面- 主题和观察者 . 当我们的系统有多个对象(称为观察者)时 ,将使用一个模式,即依赖于一个特定对象( ...

  6. java 观察者模式示例_观察者设计模式示例

    java 观察者模式示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如 ...

  7. Java中的观察者设计模式

    在本教程中,我们将讨论Observer设计模式. 观察者模式有两个主要方面- 主题和观察者 . 当我们的系统有多个对象(称为观察者)时 ,将使用一个模式,该对象依赖于一个特定对象( 主体)的状态 . ...

  8. java 观察者模式示例_Java中的观察者设计模式-示例教程

    java 观察者模式示例 观察者模式是行为设计模式之一 . 当您对对象的状态感兴趣并希望在发生任何更改时得到通知时,观察者设计模式很有用. 在观察者模式中,监视另一个对象状态的对象称为Observer ...

  9. Java中的观察者设计模式-示例教程

    观察者模式是行为设计模式之一 . 当您对对象的状态感兴趣并希望在发生任何更改时得到通知时,观察者设计模式很有用. 在观察者模式中,监视另一个对象状态的对象称为Observer ,而正在监视的对象称为S ...

最新文章

  1. NoSQL数据库兴起
  2. Django知识总结
  3. 解决本地文件上传时fakepath的问题
  4. 【Android】移动端接入Cronet实践
  5. Java学习4:方法的重载(Overload)详解及实例说明
  6. JFrame中添加背景音乐
  7. 阿里云国际版建立云端数据库操作流程
  8. PBOC规范研究之十 ---标准动态数据认证(转)
  9. UVA 10163 Storage Keepers (01背包DP + 二分)
  10. 三相交流电源中相电压电流符号表示
  11. 隐藏IP地址的4个好处
  12. 对话哈希未来贾英昊:资产上链的第一性原理 |链捕手
  13. medusa命令介绍
  14. python字符串equals方法_equals方法和 == 的使用
  15. Win 10 企业版发大招 招招吸引SMB用户
  16. 【莫烦Python】Python 基础教程——学习笔记
  17. CentOS6u9 Oracle11g RAC 搭建部署(八)OGG测试
  18. 用LaTeX写作业——插入图片
  19. redhat双系统Linux引导,用wingrub引导windows与redhat linux双系统
  20. 小丸工具箱+微信Channels

热门文章

  1. C++自学者的困境!
  2. 【深度学习】Tensorflow2.x入门(一)建立模型的三种模式
  3. 复现经典:《统计学习方法》第20章 潜在狄利克雷分配
  4. 复现经典:《统计学习方法》第 4 章 朴素贝叶斯
  5. 目标检测的“尽头”竟是语言建模?Hinton团队提出Pix2Seq:性能优于DETR
  6. 就差一点点-微妙的强制类型转换
  7. 《货币是个什么东西》笔记
  8. PHP Redis 集群封装类
  9. C#学习笔记(六):可空类型、匿名方法和迭代器
  10. 某省高职比赛试题(园区网互联)