事件处理模型
场景示例:小朋友睡醒了哭,饿!
/**
* @description: 观察者模式-v1版本(披着面向对象的外衣的面向过程)
* @author: flygo
* @time: 2022/7/18 16:57
*/
public class ObserverMain {
public static void main(String[] args) {
boolean cry = false;
if (!cry) {
// 进行处理
}
}
}
/**
* @description: 观察者模式-v2版本(面向对象的傻等)
* @author: flygo
* @time: 2022/7/18 16:57
*/
public class ObserverMain {
public static void main(String[] args) {
Child child = new Child();
while (!child.isCry()) {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Observing......");
}
}
}
class Child {
private boolean cry = false;
public boolean isCry() {
return cry;
}
public void setCry(boolean cry) {
this.cry = cry;
}
public void wakeUp() {
System.out.println("Waked Up!Crying.......");
}
}
/**
* @description: 观察者模式-v3版本(加入观察者)
* @author: flygo
* @time: 2022/7/18 16:57
*/
public class ObserverMain {
public static void main(String[] args) {
Child child = new Child();
child.wakeUp();
}
}
class Dad {
public void feed() {
System.out.println("Dad feeding...");
}
}
class Child {
private boolean cry = false;
private Dad dad = new Dad();
public boolean isCry() {
return cry;
}
public void setCry(boolean cry) {
this.cry = cry;
}
public void wakeUp() {
cry = true;
dad.feed();
}
}
/**
* @description: 观察者模式-v4版本(加入多个观察者)
* @author: flygo
* @time: 2022/7/18 16:57
*/
public class ObserverMain {
public static void main(String[] args) {
Child child = new Child();
child.wakeUp();
}
}
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...");
}
}
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 setCry(boolean cry) {
this.cry = cry;
}
public void wakeUp() {
cry = true;
dad.feed();
mum.hug();
dog.wang();
}
}
/**
* @description: 观察者模式-v5版本(加入多个观察者,采用接口实现的方式)
* @author: flygo
* @time: 2022/7/18 16:57
*/
public class ObserverMain {
public static void main(String[] args) {
Child child = new Child();
child.wakeUp();
}
}
interface Observer {
void actionOnWakeUp();
}
class Dad implements Observer {
public void feed() {
System.out.println("Dad feeding...");
}
@Override
public void actionOnWakeUp() {
feed();
}
}
class Mum implements Observer {
public void hug() {
System.out.println("Mum hugging...");
}
@Override
public void actionOnWakeUp() {
hug();
}
}
class Dog implements Observer {
public void wang() {
System.out.println("dog wang...");
}
@Override
public void actionOnWakeUp() {
wang();
}
}
class Child {
private boolean cry = false;
private List observerList = new ArrayList<>();
{
observerList.add(new Dad());
observerList.add(new Mum());
observerList.add(new Dog());
}
public boolean isCry() {
return cry;
}
public void setCry(boolean cry) {
this.cry = cry;
}
public void wakeUp() {
cry = true;
for (Observer o : observerList) {
o.actionOnWakeUp();
}
}
}
import java.util.ArrayList;
import java.util.List;
/**
* @description: 观察者模式-v5版本(加入多个观察者,增加事件对象)
* @author: flygo
* @time: 2022/7/18 16:57
*/
public class ObserverMain {
public static void main(String[] args) {
Child child = new Child();
child.wakeUp();
}
}
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...");
}
@Override
public void actionOnWakeUp(WakeUpEvent event) {
feed();
}
}
class Mum implements Observer {
public void hug() {
System.out.println("Mum hugging...");
}
@Override
public void actionOnWakeUp(WakeUpEvent event) {
hug();
}
}
class Dog implements Observer {
public void wang() {
System.out.println("dog wang...");
}
@Override
public void actionOnWakeUp(WakeUpEvent event) {
wang();
}
}
class Child {
private boolean cry = false;
private List observerList = new ArrayList<>();
{
observerList.add(new Dad());
observerList.add(new Mum());
observerList.add(new Dog());
}
public boolean isCry() {
return cry;
}
public void setCry(boolean cry) {
this.cry = cry;
}
public void wakeUp() {
cry = true;
WakeUpEvent event = new WakeUpEvent(System.currentTimeMillis(), "bed");
for (Observer o : observerList) {
o.actionOnWakeUp(event);
}
}
}
import java.util.ArrayList;
import java.util.List;
/**
* @description: 观察者模式-v5版本(加入多个观察者,增加事件对象且事件对象增加事件源)
* @author: flygo
* @time: 2022/7/18 16:57
*/
public class ObserverMain {
public static void main(String[] args) {
Child child = new Child();
child.wakeUp();
}
}
interface Observer {
void actionOnWakeUp(WakeUpEvent event);
}
class Dad implements Observer {
public void feed() {
System.out.println("Dad feeding...");
}
@Override
public void actionOnWakeUp(WakeUpEvent event) {
feed();
}
}
class Mum implements Observer {
public void hug() {
System.out.println("Mum hugging...");
}
@Override
public void actionOnWakeUp(WakeUpEvent event) {
hug();
}
}
class Dog implements Observer {
public void wang() {
System.out.println("dog wang...");
}
@Override
public void actionOnWakeUp(WakeUpEvent event) {
wang();
}
}
class WakeUpEvent {
long timestamp;
String loc;
Child child;
public WakeUpEvent(long timestamp, String loc, Child child) {
this.timestamp = timestamp;
this.loc = loc;
this.child = child;
}
}
class Child {
private boolean cry = false;
private List observerList = new ArrayList<>();
{
observerList.add(new Dad());
observerList.add(new Mum());
observerList.add(new Dog());
}
public boolean isCry() {
return cry;
}
public void setCry(boolean cry) {
this.cry = cry;
}
public void wakeUp() {
cry = true;
WakeUpEvent event = new WakeUpEvent(System.currentTimeMillis(), "bed", this);
for (Observer o : observerList) {
o.actionOnWakeUp(event);
}
}
}
import java.util.ArrayList;
import java.util.List;
/**
* @description: 观察者模式-v5版本(加入多个观察者,事件体系)
* @author: flygo
* @time: 2022/7/18 16:57
*/
public class ObserverMain {
public static void main(String[] args) {
Child child = new Child();
child.wakeUp();
}
}
interface Observer {
void actionOnWakeUp(WakeUpEvent event);
}
class Dad implements Observer {
public void feed() {
System.out.println("Dad feeding...");
}
@Override
public void actionOnWakeUp(WakeUpEvent event) {
feed();
}
}
class Mum implements Observer {
public void hug() {
System.out.println("Mum hugging...");
}
@Override
public void actionOnWakeUp(WakeUpEvent event) {
hug();
}
}
class Dog implements Observer {
public void wang() {
System.out.println("dog wang...");
}
@Override
public void actionOnWakeUp(WakeUpEvent event) {
wang();
}
}
abstract class Event {
// 事件源
abstract T getSource();
}
class WakeUpEvent extends Event {
long timestamp;
String loc;
Child source;
public WakeUpEvent(long timestamp, String loc, Child source) {
this.timestamp = timestamp;
this.loc = loc;
this.source = source;
}
@Override
Child getSource() {
return source;
}
}
class Child {
private boolean cry = false;
private List observerList = new ArrayList<>();
{
observerList.add(new Dad());
observerList.add(new Mum());
observerList.add(new Dog());
}
public boolean isCry() {
return cry;
}
public void setCry(boolean cry) {
this.cry = cry;
}
public void wakeUp() {
cry = true;
WakeUpEvent event = new WakeUpEvent(System.currentTimeMillis(), "bed", this);
for (Observer o : observerList) {
o.actionOnWakeUp(event);
}
}
}
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
* @description: 简单的一个按钮点击小例子演示java原生使用的观察者模式
* @author: flygo
* @time: 2022/7/19 10:20
*/
public class TestFrame extends Frame {
public void launch() {
Button button = new Button("press me");
button.addActionListener(new MyButtonActionListener());
button.addActionListener(new MyButtonActionListener2());
this.add(button);
this.pack();
this.addWindowListener(
new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
super.windowClosing(e);
System.exit(0);
}
});
this.setLocation(400, 400);
this.setVisible(true);
}
public static void main(String[] args) {
new TestFrame().launch();
}
}
class MyButtonActionListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
((Button) e.getSource()).setLabel("press me again!");
System.out.println("button pressed!");
}
}
class MyButtonActionListener2 implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("button pressed again!");
}
}
核心思路和逻辑
- 定义事件类
ActionEvent
- 定义接口类
ActionListener
和接口方法void actionPerformed(ActionEvent e);
- 自定义
Button
类,模拟按钮点击事件
MyActionEventListener
和 MyActionEventListener2
实现接口 void actionPerformed(ActionEvent e);
Button
添加监听者MyActionEventListener
和 MyActionEventListener2
, 模拟Button
调用点击方法buttonPressed
import java.util.ArrayList;
import java.util.List;
/**
* @description: 模拟Java原生awt button观察者模式
* @author: flygo
* @time: 2022/7/19 11:09
*/
public class ButtonObserverMain {
public static void main(String[] args) {
Button button = new Button();
button.addActionListener(new MyActionEventListener());
button.addActionListener(new MyActionEventListener2());
button.buttonPressed();
}
}
interface ActionListener {
void actionPerformed(ActionEvent e);
}
class ActionEvent {
long when;
Object source;
public ActionEvent(long when, Object source) {
this.when = when;
this.source = source;
}
public long getWhen() {
return when;
}
public Object getSource() {
return source;
}
}
class Button {
private List listenerList = new ArrayList<>();
public void buttonPressed() {
ActionEvent event = new ActionEvent(System.currentTimeMillis(), this);
for (ActionListener listener : listenerList) {
listener.actionPerformed(event);
}
}
public void addActionListener(ActionListener listener) {
this.listenerList.add(listener);
}
}
class MyActionEventListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("button pressed!");
}
}
class MyActionEventListener2 implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("button pressed again!");
}
}
JavaScript 中有钩子函数,其实就是观察者模式
import java.util.ArrayList;
import java.util.List;
/**
* @description: 模拟Java原生awt button观察者模式-钩子函数(hook)、回调(callback)、observer
* @author: flygo
* @time: 2022/7/19 11:09
*/
public class ButtonObserverMain {
public static void main(String[] args) {
Button button = new Button();
button.addActionListener(new MyActionEventListener());
button.addActionListener(new MyActionEventListener2());
button.addActionListener(
(e) -> {
System.out.println("This is lambda listener!");
});
button.buttonPressed();
}
}
interface ActionListener {
void actionPerformed(ActionEvent e);
}
class ActionEvent {
long when;
Object source;
public ActionEvent(long when, Object source) {
this.when = when;
this.source = source;
}
public long getWhen() {
return when;
}
public Object getSource() {
return source;
}
}
class Button {
private List listenerList = new ArrayList<>();
public void buttonPressed() {
ActionEvent event = new ActionEvent(System.currentTimeMillis(), this);
for (ActionListener listener : listenerList) {
listener.actionPerformed(event);
}
}
public void addActionListener(ActionListener listener) {
this.listenerList.add(listener);
}
}
class MyActionEventListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("button pressed!");
}
}
class MyActionEventListener2 implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("button pressed again!");
}
}
在很多系统中,Observer模式往往和责任链共同负责对于事件的处理,其中的某一个observer负责是否将事件往下传
https://github.com/jxaufang168/Design-Patternshttps://github.com/jxaufang168/Design-Patterns