定义:
一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。
观察者 & 被观察者。观察者时刻注意着被观察者的行为,当被观察者执行某种行为动作被观察者观察到后便会执行自己的行为动作。
四个角色
抽象观察者:为所有的具体观察者定义一个接口,得到通知时开始更新自己。
抽象被观察者:定义了所有观察者的集合,可以增加或者删除观察者对象,同时在自己状态发生改变时通知观察者对象。
具体观察者:实现抽象观察者的通知方法,用于在被观察者更新状态后更新自己。
具体被观察者:在自己状态进行改变时,向所有登记过的观察者发出通知。
// 抽象被观察者对象
public abstract class AbstractObserverable{
public abstract void regist(AbstractObserver observer);
public abstract void remove(AbstractObserver observer);
public abstract void notifyObservers();
public abstract void doSomething();
}
// 被观察者对象
public class Observerable extends AbstractObserverable{
// 观察者对象列表
private List<AbstractObserver> observers;
public Observerable(){
observers = new ArrayList<>();
}
@Override
public void regist(AbstractObserver observer)
{
if(observer!=null){
observers.add(observer);
}
}
@Override
public void remove(AbstractObserver observer)
{
if(observer!=null){
observers.remove(observer);
}
}
@Override
public void notifyObservers()
{
for(int i=0;i<observers.size();i++){
observers.get(i).update();
}
}
@Override
public void doSomething(){
System.out.println("被观察者做出行为!");
notifyObservers();
}
}
// 抽象观察者对象
public abstract class AbstractObserver{
public abstract void update();
}
// 观察者对象
public class Observer extends AbstractObserver {
private String name;
public Observer(String name){
this.name = name;
}
@Override
public void update()
{
System.out.println("观察者 ["+name+" ] : 做出反应");
}
}
// 客户端
public class Client {
public static void main(String[] args){
// 被观察者对象
AbstractObserverable observerable = new Observerable();
// 观察者对象
AbstractObserver observerA = new Observer("A");
AbstractObserver observerB = new Observer("B");
// 注册观察者对象
observerable.regist(observerA);
observerable.regist(observerB);
// 被观察者对象做出行为
observerable.doSomething();
}
}
Output:
被观察者做出行为!
观察者 [A ] : 做出反应
观察者 [B ] : 做出反应
网友评论