Java设计模式之观察者模式
2016-04-30 11:05
686 查看
1、定义:
定义对象间的一种一(目标)对多(观察者)的依赖关系;当一个目标的状态发生改变时所有依赖于它的观察者都得到通知并被自动更新。2、角色:
● 抽象主题(Subject)角色:抽象主题角色把所有对观察者对象的引用保存在一个聚集(比如ArrayList对象)里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象,抽象主题角色又叫做抽象被观察者(Observable)角色。● 具体主题(ConcreteSubject)角色:将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色又叫做具体被观察者(Concrete Observable)角色。
● 抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到主题的通知时更新自己,这个接口叫做更新接口。
● 具体观察者(ConcreteObserver)角色:存储与主题的状态自恰的状态。具体观察者角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态 像协调。如果需要,具体观察者角色可以保持一个指向具体主题对象的引用。
3、UML图
4、事例
我们实现一个这样的需求:所有的学生是观察者;老师是一个主题;当老师改变考试地点时,所有的学生都应该及时收到。抽象主题(Subject)角色:Subject
抽象主题角色把所有对观察者对象的引用保存在一个聚集(比如ArrayList对象)里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象,抽象主题角色又叫做抽象被观察者(Observable)角色。abstract class Subject<T> { protected final ArrayList<T> mSubjects = new ArrayList<T>(); public void registerObject(T subject){ if(null == subject){ throw new IllegalArgumentException("subject 不能为 null !"); } if(mSubjects.contains(subject)){ throw new IllegalArgumentException("subject 已经存在!"); } mSubjects.add(subject); } public void unRegisterObject(T subject){ if(null == subject){ throw new IllegalArgumentException("subject 不能为 null !"); } if(!mSubjects.contains(subject)){ throw new IllegalArgumentException("mSubjects 不包含 该subject !"); } mSubjects.remove(subject); } }
具体主题(ConcreteSubject)角色:ExamLocation
将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色又叫做具体被观察者(Concrete Observable)角色。我们此时的状态就是考试地点的改变。public class ExamLocation extends Subject<Observer> { public void notifyChange(String location){ for(Observer student : mSubjects){ student.update(location); } } public void changeLocation(String location){ notifyChange(location); } }
抽象观察者(Observer)角色:Observer
为所有的具体观察者定义一个接口,在得到主题的通知时更新自己,这个接口叫做更新接口。public interface Observer { public void update(String location); }
具体观察者(ConcreteObserver)角色:Student1、Student2
存储与主题的状态自恰的状态。具体观察者角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态 像协调。如果需要,具体观察者角色可以保持一个指向具体主题对象的引用。Student1:
public class Student1 implements Observer { private String location = null; public Student1(ExamLocation examLocation){ this.examLocation = examLocation; examLocation.registerObject(this); } public void update(String location) { this.location = location; } public void setLocton(String location){ this.location = location; } public String getLocation(){ return this.location; } }
Student2
public class Student2 implements Observer { private String location; public Student2(ExamLocation examLocation){ examLocation.registerObject(this); } public void update(String location) { this.location = location; } public void setLocation(String location){ this.location = location; } public String getLocation(){ return this.location; } }
控制者:负责把观察者和主题联系起来
public class ObserverDemo { public static void main(String[] args) { // TODO Auto-generated method stub ExamLocation el = new ExamLocation(); Student1 s1 = new Student1(el); Student2 s2 = new Student2(el); el.changeLocation("教A201"); System.out.println(s1.getLocation()); System.out.println(s2.getLocation()); System.out.println("----------------------"); } }
结果:
教A201教A201
我们Student1、Student2的考试location是null,当我们的考试地点发成改变时,都能收到地址改变通知。
下面让我们来分析下在Android中是如何利用观察者模式来检测数据的更新!!!
相关文章推荐
- 我理解的--java 单例模式
- 我理解的--java工厂模式
- 我理解的--java建造者模式
- 我理解的--java组合模式
- 我理解的--java门面模式
- 我理解的--java策略模式
- 我理解的--java模板方法模式
- 我理解的--java观察者模式
- 我理解的--java备忘录模式
- 我理解的--java中介者模式
- 从赵本山的小品联想到的Java设计模式
- JAVA设计模式学习第三天 设计模式之Chain of Responsibility——项目篇
- 学习:java设计模式—工厂模式
- 设计模式----简单工厂模式
- Java设计模式 创建模式-工厂模式(Factory)
- Java设计模式 创建模式-原型模式(Prototype)
- Java设计模式 创建模式-生成器模式(Builder)
- Java设计模式 创建模式-单态模式(Singleton)
- Java设计模式 结构模式-适配器模式(Adapter)