观察者模式有两个角色,一个是观察者Observer,另外一个是被观察者Subject,多个观察者Observer观察Subject,当Subject有所变化时,Observer也随之做出相应的变化。
首先定义观察者抽象类Observer,定义通用的做出改动的方法,这里最好是设置抽象类,里面放置一个抽象方法update方法,每个观察者都持有一个通用的Subject,观察Subject所做出的变化
public abstract class Observer {
protected Subject subject;
public abstract void update();
}
然后是定义三个观察者实现类,每个实现类实现自己的update方法,同时将通用的Subject和自己进行绑定
package test.observer;
/**
* @Author zhangjinhe01
* @Date 2020/1/31 11:26
**/
public class BinaryObserver extends Observer {
public BinaryObserver(Subject subject) {
this.subject = subject;
subject.attach(this);
}
@Override
public void update() {
System.out.println( "Binary String: "
+ Integer.toBinaryString( subject.getState() ) );
}
}
package test.observer;
/**
* @Author zhangjinhe01
* @Date 2020/1/31 11:31
**/
public class HexaObserver extends Observer {
public HexaObserver(Subject subject) {
this.subject = subject;
subject.attach(this);
}
@Override
public void update() {
System.out.println( "Hex String: "
+ Integer.toHexString( subject.getState() ).toUpperCase() );
}
}
package test.observer;
/**
* @Author zhangjinhe01
* @Date 2020/1/31 11:30
**/
public class OctalObserver extends Observer {
public OctalObserver(Subject subject) {
this.subject = subject;
subject.attach(this);
}
@Override
public void update() {
System.out.println( "Octal String: "
+ Integer.toOctalString( subject.getState() ) );
}
}
定义完观察者角色后,然后定义被观察者Subject,因为每一个观察者都对Subject实例进行观察,因此Subject实例需要维护一个list,来记录此Subject都被哪些观察者观察,当Subject实例有所变化时(这里指setState方法设置值时),将执行所有Observer的update()方法。
package test.observer;
import java.util.ArrayList;
import java.util.List;
/**
* @Author zhangjinhe01
* @Date 2020/1/31 11:20
**/
public class Subject {
private List<Observer> observers = new ArrayList<>();
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
this.notifyAllObservers();
}
public void attach(Observer observer) {
observers.add(observer);
}
private void notifyAllObservers(){
for (Observer observer : observers) {
observer.update();
}
}
}
最后是执行结果:
Binary String: 1111
Hex String: F
Octal String: 17
------------------------------------------
Binary String: 1010
Hex String: A
Octal String: 12