一个简单的观察者模式demo
定义对象之间一对多的关系,当一个对象状态被更新时,所有依赖于它的对象都将被更新。观察者模式有四种定义角色,分别为:抽象主题(Subject)、具体主题(ConcreteSubject)、抽象观察者(Observer)、具体观察者(ConcreteObserver)。
这种模式可以理解为:抽象主题中定义具体主题需要包含的方法,具体主题继承抽象主题,并对抽象主题中的抽象方法给出具体实现,包括对观察者的注册、观察者的移除、通知观察者方法的具体实现。抽象观察者定义具体观察者中需要包含的状态更新抽象方法,具体观察者继承抽象观察者并给出抽象方法的具体实现。具体观察者实例化时由具体主题进行注册。当具体主题的状态发生变化时,具体主题中的通知观察者方法会给已经注册的具体观察者发出广播通知,对具体观察者的状态进行更新。
下面给出demo的实现代码。
抽象观察者:
public abstract class Observer {
public abstract void update();
}
具体观察者1
public class BinaryObserver extends Observer{
private Subject subject;
public BinaryObserver(ConcreteSubject subject){
this.subject=subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println("Binary string:"+Integer.toBinaryString(subject.getState()));
}
}
具体观察者2
public class HexObserver extends Observer {
private Subject subject;
public HexObserver(ConcreteSubjectsubject){
this.subject=subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println("Hex String:"+Integer.toHexString(subject.getState()));
}
}
具体观察者3
public class OctalObserver extends Observer {
private Subject subject;
public OctalObserver(ConcreteSubject subject){
this.subject=subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println("Ocatl String:"+Integer.toOctalString(subject.getState()));
}
}
抽象主题
public abstract class Subject {
/**
* 增加观察者
* @param observer
*/
public abstract void attach(Observer observer);
/**
* 删除观察者
* @param observer
*/
public abstract void detach(Observer observer);
/**
* 通知观察者
*/
public abstract void notifyObserver();
}
具体主题
public class ConcreteSubject extends Subject {
private List<Observer> observers=new ArrayList<Observer>();
private int state;
public int getState(){
return state;
}
public void setState(int state){
this.state=state;
notifyAllObservers();
}
@Override
public void detach(Observer observer){
observers.remove(observer);
}
@Override
public void attach(Observer observer){
observers.add(observer);
}
@Override
public void notifyObservers(){
for (Observer observer:observers){
observer.update();
}
}
}
测试Demo
public class Main {
public static void main(String[] args){
ConcreteSubject subject=new ConcreteSubject();
new BinaryObserver(subject);
new OctalObserver(subject);
new HexObserver(subject);
System.out.println("第一次更新:");
subject.setState(15);
System.out.println("第二次更新:");
subject.setState(10);
}
}
以上内容均为个人理解,如有错误之处,敬请批评指正!谢谢~