Observer Pattern
定义
观察者模式定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。场景
发布者发布消息,订阅者接受消息OO原则
- 为交互对象之间的松耦合设计而努力,松耦合设计更有弹性,更能应对变化。
示例场景
关注了某公众号的用户可以收到推文,未关注的收不到推文,取消关注后也不能收到推文。
类图
示例代码
观察者接口
public interface Observer {
public void update(String message);
}
可观察者接口
public interface Observerable {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObsercers();
}
定义观察者
public class User implements Observer {
private String username;
private String message;
public User(String username) {
this.username = username;
}
@Override
public void update(String message) {
this.message = message;
display();
}
public void display() {
System.out.println(username + "收到推文:" + message);
}
}
定义公众号
import java.util.List;
import java.util.ArrayList;
public class OfficialAccount implements Observerable {
private List<Observer> list;
private String message;
public OfficialAccount() {
list = new ArrayList<Observer>();
}
@Override
public void registerObserver(Observer o) {
list.add(o);
}
@Override
public void removeObserver(Observer o) {
if(!list.isEmpty())
list.remove(o);
}
@Override
public void notifyObsercers() {
for (Observer observer : list) {
observer.update(message);
}
}
public void setInfo(String message) {
this.message = message;
System.out.println("公众号推文:" + message);
//通知观察者
notifyObsercers();
}
}
创建测试类
public class Test {
public static void main(String[] args) {
OfficialAccount officialAccount = new OfficialAccount();
//创建观察者
Observer py = new User("py");
Observer qpf = new User("qpf");
//注册观察者
officialAccount.registerObserver(py);
officialAccount.registerObserver(qpf);
//公众号编写推文
officialAccount.setInfo("第一篇推文");
//删除qpf后推文
officialAccount.removeObserver(qpf);
officialAccount.setInfo("第二篇推文");
}
}
运行结果如下: