定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
需求:
在用户上线时,有各种各样的事情要处理:发一封欢迎信、增加登录积分、查询未读邮件数做提示、提醒修改密码,并且随时会增加新的需求或者删除过时功能。
UML图:
代码:
public class LoginEvent extends EventObject {
public LoginEvent(String name) {
super(name);
this.name = name;
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public interface Listener {
void onEvent(LoginEvent loginEvent);
}
public class EmailListener implements Listener {
@Override
public void onEvent(LoginEvent loginEvent) {
System.out.println("给" + loginEvent.getName() + "发送了一封邮件");
}
}
public class TokenListener implements Listener {
@Override
public void onEvent(LoginEvent loginEvent) {
System.out.println("给" + loginEvent.getName() + "增加10金币");
}
}
public class Publisher {
private List<Listener> listeners = new ArrayList<>();
public void attach(Listener listener) {
this.listeners.add(listener);
}
public void detach(Listener listener) {
this.listeners.remove(listener);
}
public void publish(LoginEvent loginEvent) {
for(Listener listener : listeners) {
listener.onEvent(loginEvent);
}
}
}
客户端:
public class Client {
public static void main(String[] args) {
Publisher publisher = new Publisher();
Listener emailListener = new EmailListener();
publisher.attach(emailListener);
TokenListener tokenListener = new TokenListener();
publisher.attach(tokenListener);
publisher.publish(new LoginEvent("王五"));
//需求变更,登录不再给金币了
publisher.detach(tokenListener);
publisher.publish(new LoginEvent("李四"));
}
}
观察者模式是一个比较常用的设计模式,Spring中的事件机制即使用了该模式。