观察者模式

1. 什么是观察者模式

Observer 模式是行为模式之一,它的作用是当个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态。

Observer 模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步。

2. 观察者模式的结构

16_观察者模式 - 图1

3. 观察者模式的角色和职责

  • Subject(被观察者):被观察的对象。当需要被观察的状态发生变化时,需要通知队列中所有观察者对象。Subject 需要维持(添加、删除、通知)一个观察者对象的队列列表。
  • Concrete Subject:被观察者的具体实现。包含一些基本的属性状态及其他操作。
  • Observer(观察者):接口或抽象类。当 Subject 的状态发生变化时,Observer 对象将通过 callback 函数得到通知。
  • Concrete Observer:观察者的具体实现。得到通知后将完成一些具体的业务逻辑处理。

4. 观察者模式的经典应用

  • 侦听事件驱动程序设计中的外部事件。
  • 侦听/监视某个对象的状态变化。
  • 发布者/订阅者(publisher/subscriber)模型中,当一个外部事件(新的产品,消息的出现等等)被触发时,通知邮件列表中的订阅者。

5. 代码演示

5.1. Person

  1. public class Person extends Observable {
  2. private String name;
  3. private int age;
  4. private String sex;
  5. public String getName() {
  6. return name;
  7. }
  8. public void setName(String name) {
  9. this.name = name;
  10. this.setChanged();
  11. this.notifyObservers();
  12. }
  13. public int getAge() {
  14. return age;
  15. }
  16. public void setAge(int age) {
  17. this.age = age;
  18. this.setChanged();
  19. this.notifyObservers();
  20. }
  21. public String getSex() {
  22. return sex;
  23. }
  24. public void setSex(String sex) {
  25. this.sex = sex;
  26. this.setChanged();
  27. this.notifyObservers();
  28. }
  29. }
  1. public class MyObserver1 implements Observer {
  2. private final String name;
  3. public MyObserver1(String name) {
  4. this.name = name;
  5. }
  6. @Override
  7. public void update(Observable o, Object arg) {
  8. System.out.println(this.name + ":对象发生变化");
  9. }
  10. }
  1. Person person = new Person();
  2. person.addObserver(new MyObserver1("观察者1"));
  3. person.addObserver(new MyObserver1("观察者2"));
  4. System.out.println(person.countObservers());
  5. person.setName("lifengxing");
  6. person.setAge(23);
  7. person.setSex("男");
  1. 2
  2. 观察者2:对象发生变化
  3. 观察者1:对象发生变化
  4. 观察者2:对象发生变化
  5. 观察者1:对象发生变化
  6. 观察者2:对象发生变化
  7. 观察者1:对象发生变化

5.2. BlogUser

  1. public class Article {
  2. private String title;
  3. private String content;
  4. public String getTitle() {
  5. return title;
  6. }
  7. public void setTitle(String title) {
  8. this.title = title;
  9. }
  10. public String getContent() {
  11. return content;
  12. }
  13. public void setContent(String content) {
  14. this.content = content;
  15. }
  16. }
  1. public class BlogUser extends Observable {
  2. public void publishBlog(String title, String content) {
  3. Article article = new Article();
  4. article.setTitle(title);
  5. article.setContent(content);
  6. System.out.println("博主:发表新文章,文章标题:" + title + ",文章内容:" + content);
  7. this.setChanged();
  8. this.notifyObservers(article);
  9. }
  10. }
  1. public class MyObserver2 implements Observer {
  2. @Override
  3. public void update(Observable o, Object arg) {
  4. Article article = (Article) arg;
  5. System.out.println("博主发布可新文章,快去看看吧");
  6. System.out.println("博客标题为:" + article.getTitle());
  7. System.out.println("博客内容为:" + article.getContent());
  8. }
  9. }
  1. BlogUser blogUser = new BlogUser();
  2. blogUser.addObserver(new MyObserver2());
  3. blogUser.publishBlog("哈哈,博主上线了", "大家多来访问");
  1. 博主:发表新文章,文章标题:哈哈,博主上线了,文章内容:大家多来访问
  2. 博主发布可新文章,快去看看吧
  3. 博客标题为:哈哈,博主上线了
  4. 博客内容为:大家多来访问