1.定义
Observer模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其它关联对象,自动刷新对象状态。
Observer模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持同步状态。
2.观察者模式的角色和职责
- Subject(被观察者)--被观察的对象。当需要被观察的状态发生变化时,需要通知队列中所有观察者对象。Subject需要维持(添加、删除、通知)一个观察者对象的队列列表。
- ConcreteSubject--被观察者的具体实现。包含一些基本的属性状态及其他操作。
- Observer(观察者)--接口或抽象类。当Subject的状态发生变化时,Observer对象将通过一个callback函数得到通知。
- ConcreteObserver--观察者的具体实现。得到通知后将完成一些具体的业务逻辑处理。
3.观察者模式的结构
4.Observer模式的典型应用
- 侦听事件驱动程序设计中的外部事件
- 侦听/监视某个对象的状态变化
- 发布者/订阅者(publisher/subscriber)模型中,当一个外部事件(新的产品,消息的出现等等)被触发时,通知邮件列表中的订阅者。
5.代码演示
package test.com.observer; import java.util.Observable; /* * 被观察对象--Subject */ public class Person extends Observable { private String name; private String sex; private int age; public Person() { super(); } public String getName() { return name; } public void setName(String name) { this.name = name; //将被观察者的状态设置为已改变 this.setChanged(); //通知观察者 this.notifyObservers(); } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; //将被观察者的状态设置为已改变 this.setChanged(); //通知观察者 this.notifyObservers(); } public int getAge() { return age; } public void setAge(int age) { this.age = age; //将被观察者的状态设置为已改变 this.setChanged(); //通知观察者 this.notifyObservers(); } }
package test.com.observer; import java.util.Observable; import java.util.Observer; /* * 观察者--Observer */ public class MyObserve implements Observer { @Override public void update(Observable arg0, Object arg1) { System.out.println("对象已被修改"); } }
package test.com.observer; /* * 测试类 */ public class MainClass { public static void main(String[] args) { Person per = new Person(); //注册观察者 per.addObserver(new MyObserve()); //修改对象 per.setAge(12); per.setName("张三"); per.setSex("男"); } }
6.发布者/订阅者示例演示
package test.com.observer2; /* * ConcreteSubject */ public class Article { private String articleTitle; private String articleContent; public Article() { super(); } public String getArticleTitle() { return articleTitle; } public void setArticleTitle(String articleTitle) { this.articleTitle = articleTitle; } public String getArticleContent() { return articleContent; } public void setArticleContent(String articleContent) { this.articleContent = articleContent; } }
package test.com.observer2; import java.util.Observable; /* * 被观察者(Subject)--发布者 */ public class Publisher extends Observable { public void notice() { Article art = new Article(); art.setArticleTitle("今天天气状况"); art.setArticleContent("今天真是美好的一天,天气晴朗!"); System.out.println("我发布了新的文章"); //将被观察者的状态设置为已改变 this.setChanged(); //通知观察者 this.notifyObservers(art); } }
package test.com.observer2; import java.util.Observable; import java.util.Observer; /* * 观察者(Observer)--订阅者 */ public class Order implements Observer { //arg--被修改的对象 @Override public void update(Observable o, Object arg) { Article art = (Article)arg; System.out.println("文章主题:" + art.getArticleTitle()); System.out.println("文章内容:" + art.getArticleContent()); } }
package test.com.observer2; /* * 测试类 */ public class MainClass { public static void main(String[] args) { Publisher pub = new Publisher(); pub.addObserver(new Order()); pub.notice(); } }