是什么观察者模式
观察者模式是一种行为设计模式, 允许你定义一种订阅机制, 可在对象事件发生时通知多个 “观察” 该对象的其他对象。
什么时候可以使用观察者模式
当一个事件发生或者一个东西的状态发生了变化时,会有其他响应的事件被触发。例如,当一个用户在注册之后成为一个系统的用户时,系统可能会给他发邮件、发放一些优惠券并且同时去推荐用户一些内容。这个时候就可以使用观察者模式。
又或者一些用户订阅了一个公众号,每当公众号有内文章发布时,这个用户就会受到相应的通知。这也是使用了关观察者模式。
观察者模式代码演示
// 当用户在注册成功之后用户的相关信息
public class Message {
}
//用来保存观察者,并提供通知功能
public interface Subject {
public void registerObserver(Observer observer);
public void removeObserver(Observer observer);
public void notifyObservers(Message message);
}
//观察者
public interface Observer {
public void update(Message message);
}
//Subject的具体实现
public class UserRegisterSubject implements Subject {
private List<Observer> observers = new ArrayList<Observer>();
@Override
public void registerObserver(Observer observer) {
if (observer != null) {
observers.add(observer);
}
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers(Message message) {
for (Observer o : observers) {
o.update(message);
}
}
}
//当收到通知之后,给用户发邮件
public class EmailObserver implements Observer {
@Override
public void update(Message message) {
System.out.println("Send email to user");
}
}
//当收到通知之后,给用户推送内容
public class RecommdationObserver implements Observer{
@Override
public void update(Message message) {
System.out.println("Recommend hot news to user...");
}
}
public class Application {
public static void main(String[] args) {
Subject subject = new UserRegisterSubject();
Observer emailObserver = new EmailObserver();
Observer recommendationObserver = new RecommdationObserver();
subject.registerObserver(emailObserver);
subject.registerObserver(recommendationObserver);
System.out.println("when a user registered");
subject.notifyObservers(new Message());
}
}
观察者模式的优缺点
优点
- 开闭原则。 你无需修改发布者代码就能引入新的订阅者类 (如果是发布者接口则可轻松引入发布者类)。
- 你可以在运行时建立对象之间的联系。
缺点
- 订阅者的通知顺序是随机的。