今天看到一段代码很有意思,因为以前没有接触到过这两个类,所以简单的学习一下
观察者模式
我的理解就是有观察者和被观察者两个角色,当被观察者执行某些操作被观察者观察到后,观察者也做出相应的操作。
我今天看到的代码是有个被观察者是一个单子,当这个单子的内容被更新的时候,将这个情况通知观察者,观察者是一个rest请求的发送器,观察者就会把这个单子变化的情况推送到其他需要知道单子被修改的地方。刚开始看代码的时候还在想,这个http请求是怎么发送出去的,了解了这个类后就明白了。
类的说明
- Observer
观察者接口,实现这个接口的都是观察者实现。简单的实现如下:
public class MyObserver implements Observer {
@Override
public void update(Observable o, Object arg) {
//加一个判断,既可以防止强转失败,而且可以避免不是此观察者需要观察的被观察者进行方法
if (o instanceof MyObservable) {
//强转获取到被观察者对象
MyObservable myObservable = (MyObservable) o;
System.out.println("被观察者改名了:" + myObservable.getName());
}
}
}
- Observable
被观察者类,继承这个类即可:
public class MyObservable extends Observable {
private String name = "ONE";
public void change(String name) {
this.setName(name);
//标识此对象已经被修改
this.setChanged();
//通知所有的观察者,相当于唤醒所有观察者的线程执行观察者的方法
this.notifyObservers();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static void main(String[] args) {
MyObservable myObservable = new MyObservable();
myObservable.addObserver(new MyObserver());
myObservable.change("Jack");
myObservable.change("Pony");
myObservable.change("Rookie");
}
}
main方法结果如下:
被观察者改名了:Jack
被观察者改名了:Pony
被观察者改名了:Rookie
通过以上两个类和接口就可以快速构建一个观察者模式,减少代码量,爱护手指。