啥是观察者模式呐?
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。
总结:天网恢恢 不疏不漏
所谓道高一尺魔高一丈也就是这样,只要你有政策(动作),我必然有对策
实现方式(附图) 模拟不同的观察者对温度变化做出反应
被观察者类:Observable.java
package com.lagersoft.test;
import java.util.ArrayList;
import java.util.List;
//被观察者
public class Observable {
private List<Observer> observers = new ArrayList<Observer>();
//温度状态
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
notifyAllObservers();
}
//添加一个观察者
public void attach(Observer observer){
observers.add(observer);
}
//通知所有订阅了当前被观察者的观察者
public void notifyAllObservers(){
for (Observer observer : observers) {
observer.update();
}
}
}
观察者抽象类 Observer.java
package com.lagersoft.test;
//观察者
public abstract class Observer {
//被观察的对象
protected Observable subject;
public abstract void update();
}
观察者实现类1 FirstObserver.java
package com.lagersoft.test;
/**
* 实现观察者1
* @author Administrator
*
*/
public class FirstObserver extends Observer{
//构造时
public FirstObserver(Observable subject){
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println( "First观察到温度变化: " + subject.getState());
}
}
观察者实现类2 SecondObserver.java
package com.lagersoft.test;
/**
* 实现观察者2
* @author Administrator
*
*/
public class SecondObserver extends Observer{
public SecondObserver(Observable subject){
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
if(subject.getState() > 12){
System.out.println( "Second感受到温度变化: " + subject.getState() + "热死了");
}else{
System.out.println( "Second感受到温度变化: " + subject.getState() + "这就很舒服了");
}
}
}
测试程序Main.java
package com.lagersoft.test;
public class Main {
public static void main(String[] args) {
Observable subject = new Observable();
//构造观察者
new FirstObserver(subject);
new SecondObserver(subject);
System.out.println("当前温度: 15℃");
//被观察者载入温度
subject.setState(15);
System.out.println("当前温度: 10℃");
//被观察者载入温度
subject.setState(10);
}
}
输出:
当前温度: 15℃
First观察到温度变化: 15
Second感受到温度变化: 15热死了
当前温度: 10℃
First观察到温度变化: 10
Second感受到温度变化: 10这就很舒服了
注意事项: 1、JAVA 中已经有了对观察者模式的支持类。 2、避免循环引用。 3、如果顺序执行,某一观察者错误会导致系统卡壳,一般采用异步方式。