观察者模式
1. 什么是观察者模式
Observer 模式是行为模式之一,它的作用是当个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态。
Observer 模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步。
2. 观察者模式的结构

3. 观察者模式的角色和职责
- Subject(被观察者):被观察的对象。当需要被观察的状态发生变化时,需要通知队列中所有观察者对象。Subject 需要维持(添加、删除、通知)一个观察者对象的队列列表。
- Concrete Subject:被观察者的具体实现。包含一些基本的属性状态及其他操作。
- Observer(观察者):接口或抽象类。当 Subject 的状态发生变化时,Observer 对象将通过 callback 函数得到通知。
- Concrete Observer:观察者的具体实现。得到通知后将完成一些具体的业务逻辑处理。
4. 观察者模式的经典应用
- 侦听事件驱动程序设计中的外部事件。
- 侦听/监视某个对象的状态变化。
- 发布者/订阅者(publisher/subscriber)模型中,当一个外部事件(新的产品,消息的出现等等)被触发时,通知邮件列表中的订阅者。
5. 代码演示
5.1. Person
public class Person extends Observable {private String name;private int age;private String sex;public String getName() {return name;}public void setName(String name) {this.name = name;this.setChanged();this.notifyObservers();}public int getAge() {return age;}public void setAge(int age) {this.age = age;this.setChanged();this.notifyObservers();}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;this.setChanged();this.notifyObservers();}}
public class MyObserver1 implements Observer {private final String name;public MyObserver1(String name) {this.name = name;}@Overridepublic void update(Observable o, Object arg) {System.out.println(this.name + ":对象发生变化");}}
Person person = new Person();person.addObserver(new MyObserver1("观察者1"));person.addObserver(new MyObserver1("观察者2"));System.out.println(person.countObservers());person.setName("lifengxing");person.setAge(23);person.setSex("男");
2观察者2:对象发生变化观察者1:对象发生变化观察者2:对象发生变化观察者1:对象发生变化观察者2:对象发生变化观察者1:对象发生变化
5.2. BlogUser
public class Article {private String title;private String content;public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}}
public class BlogUser extends Observable {public void publishBlog(String title, String content) {Article article = new Article();article.setTitle(title);article.setContent(content);System.out.println("博主:发表新文章,文章标题:" + title + ",文章内容:" + content);this.setChanged();this.notifyObservers(article);}}
public class MyObserver2 implements Observer {@Overridepublic void update(Observable o, Object arg) {Article article = (Article) arg;System.out.println("博主发布可新文章,快去看看吧");System.out.println("博客标题为:" + article.getTitle());System.out.println("博客内容为:" + article.getContent());}}
BlogUser blogUser = new BlogUser();blogUser.addObserver(new MyObserver2());blogUser.publishBlog("哈哈,博主上线了", "大家多来访问");
博主:发表新文章,文章标题:哈哈,博主上线了,文章内容:大家多来访问博主发布可新文章,快去看看吧博客标题为:哈哈,博主上线了博客内容为:大家多来访问
