【设计模式】观察者模式
缘由是学校一门移动运用开发的课,在学习girhub某大佬的源码后发现了
@Subscribe(threadMode = ThreadMode.MAIN)
别名
Observer模式‘
依赖(Dependents)
发布-订阅模式(Publish-Subscribe)
概念
Observer模式定义对象间的一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。JDK里提供的observer设计模式的实现由java.util.Observable类和 java.util.Observer接口组成。从名字上可以清楚的看出两者在Observer 设计模式中分别扮演的角色:Observer是观察者角色,Observable是被观察目标(subject)角色。
对象
Observer :观察者
Observable :被观察对象
JAVA观察者模式
其中java中自带了函数接口
import java.io.*;
import java.math.BigInteger;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class Water extends Observable implements Runnable {
private long water=0;
public long getWater() {
return water;
}
public void setWater(long water) {
this.water = water;
}
@Override
public void run() {
while(true) {
try {
setChanged();
//此处不置时模式为pull模式,即需要自己去订阅而非推送
notifyObservers(this);
water++;
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class WaterMeter implements Observer{
Observable observable;
long water;
WaterMeter(Observable observable){
this.observable=observable;
observable.addObserver(this);
}
@Override
public void update(Observable o, Object arg) {
if (arg instanceof Water) {//判断主题是否对应 、
Water water = (Water)arg;
this.water = water.getWater();
display();
}
}
public void display() {
System.out.println("Current water: " + water);
}
}
public class Main {
public static void main(String[] args) throws IOException {
AReader reader = new AReader(System.in);
AWriter writer = new AWriter(System.out);
Water water=new Water();
WaterMeter waterMeter=new WaterMeter(water);
new Thread(water).start();
reader.close();
writer.close();
}
}
回到主题
@Subscribe
直接上demo
public class TestEvent {
private int message;
public TestEvent(int message) {
this.message = message;
System.out.println(message);
}
public int getMessage() {
return message;
}
}
public class EventListener {
public int lastMessage = 0;
@Subscribe
public void listen(TestEvent event) {
lastMessage = event.getMessage();
System.out.println(lastMessage);
}
public int getLastMessage() {
return lastMessage;
}
}
此时代码相当于简化上式代码,用注解实现迅速观察。