观察者模式
1.总结
观察者模式有一个被观察者A,多个观察者B.B可以注册到A,A持有多个B,当达到某个条件后,A可以执行持有的B的某个方法.
2.代码
public interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers(Message message);
}
public interface Observer {
void update(Message message);
}
public class ConcreteSubject implements Subject {
private List<Observer> observers = new ArrayList<Observer>();
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers(Message message) {
for (Observer observer : observers) {
observer.update(message);
}
}
}
public class ConcreteObserverOne implements Observer {
@Override
public void update(Message message) {
//TODO: 获取消息通知,执行自己的逻辑...
System.out.println("ConcreteObserverOne is notified.");
}
}
public class ConcreteObserverTwo implements Observer {
@Override
public void update(Message message) {
//TODO: 获取消息通知,执行自己的逻辑...
System.out.println("ConcreteObserverTwo is notified.");
}
}
public class Demo {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
subject.registerObserver(new ConcreteObserverOne());
subject.registerObserver(new ConcreteObserverTwo());
subject.notifyObservers(new Message());
}
}
3.事件案例
比如,用户注册后,发放投资体验金,注册的代码和发放投资体验金的代码可以分开,注册的代码所在类是被观察者,发放投资体验金所在类是观察者.后续需求变动,注册后还发放优惠券,还要给用户发送一封“欢迎注册成功”的站内信,可以增加观察者类,并将其注册到被观察者中,注册的代码不需要改动.
4.应用场景
比如:邮件订阅