Observer观察者设计模式
目录
问题
程序模拟
版本一: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. 观察者设计模式 观察者把自己"绑定"至目标,当目标发生变化时,目标"通知"观察者,然后观察者进行相应操作.你有没有觉得这种设计模式更像发布-订阅设计模式? ...
- 《Head First设计模式》批注系列(一)——观察者设计模式
最近在读<Head First设计模式>一书,此系列会引用源书内容,但文章内容会更加直接,以及加入一些自己的理解. 观察者模式(有时又被称为模型-视图(View)模式.源-收听者(List ...
- java观察者设计模式_Java中的观察者设计模式
java观察者设计模式 在本教程中,我们将讨论Observer设计模式. 观察者模式有两个主要方面- 主题和观察者 . 当我们的系统有多个对象(称为观察者)时 ,将使用一个模式,即依赖于一个特定对象( ...
- java 观察者模式示例_观察者设计模式示例
java 观察者模式示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如 ...
- Java中的观察者设计模式
在本教程中,我们将讨论Observer设计模式. 观察者模式有两个主要方面- 主题和观察者 . 当我们的系统有多个对象(称为观察者)时 ,将使用一个模式,该对象依赖于一个特定对象( 主体)的状态 . ...
- java 观察者模式示例_Java中的观察者设计模式-示例教程
java 观察者模式示例 观察者模式是行为设计模式之一 . 当您对对象的状态感兴趣并希望在发生任何更改时得到通知时,观察者设计模式很有用. 在观察者模式中,监视另一个对象状态的对象称为Observer ...
- Java中的观察者设计模式-示例教程
观察者模式是行为设计模式之一 . 当您对对象的状态感兴趣并希望在发生任何更改时得到通知时,观察者设计模式很有用. 在观察者模式中,监视另一个对象状态的对象称为Observer ,而正在监视的对象称为S ...
最新文章
- NoSQL数据库兴起
- Django知识总结
- 解决本地文件上传时fakepath的问题
- 【Android】移动端接入Cronet实践
- Java学习4:方法的重载(Overload)详解及实例说明
- JFrame中添加背景音乐
- 阿里云国际版建立云端数据库操作流程
- PBOC规范研究之十 ---标准动态数据认证(转)
- UVA 10163 Storage Keepers (01背包DP + 二分)
- 三相交流电源中相电压电流符号表示
- 隐藏IP地址的4个好处
- 对话哈希未来贾英昊:资产上链的第一性原理 |链捕手
- medusa命令介绍
- python字符串equals方法_equals方法和 == 的使用
- Win 10 企业版发大招 招招吸引SMB用户
- 【莫烦Python】Python 基础教程——学习笔记
- CentOS6u9 Oracle11g RAC 搭建部署(八)OGG测试
- 用LaTeX写作业——插入图片
- redhat双系统Linux引导,用wingrub引导windows与redhat linux双系统
- 小丸工具箱+微信Channels