Observer观察者模式
定义:对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
观察者模式的组成部分:
1、抽象目标角色(Subject):也就是抽象的被观察者,被观察者知道它的观察者,可以有任意多个观察者观察同一个目标。并且提供注册和删除观察者对象的接口。被观察者通常是抽象类或者接口。
2、抽象观察者角色(Observer):为那些在目标发生改变时需要获得通知的对象定义一个更新接口。抽象观察者角色主要是抽象类或者接口。
3、具体的目标角色(Concrete Subject):将有关状态存入各个具体观察者对象,当它的状态发生改变时,向它的各个观察者发出通知。
4、具体观察者角色(Concrete Observer):存储有关状态,这些状态应该与目标的状态保持一致。实现Observer的更新接口使自己的状态与被观察者的状态一致。在这个角色内可以维护指向被观察者对象的引用。
适用性:
在以下任一情况下可以使用观察者模式:
1、当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将二者封装在独立的对象中以使它们可以各自独立的改变和复用。
2、当对一个对象的改变需要同时改变其它对象,而不知道具体有多少个其它对象。
观察者模式的组成部分:
1、抽象目标角色(Subject):也就是抽象的被观察者,被观察者知道它的观察者,可以有任意多个观察者观察同一个目标。并且提供注册和删除观察者对象的接口。被观察者通常是抽象类或者接口。
2、抽象观察者角色(Observer):为那些在目标发生改变时需要获得通知的对象定义一个更新接口。抽象观察者角色主要是抽象类或者接口。
3、具体的目标角色(Concrete Subject):将有关状态存入各个具体观察者对象,当它的状态发生改变时,向它的各个观察者发出通知。
4、具体观察者角色(Concrete Observer):存储有关状态,这些状态应该与目标的状态保持一致。实现Observer的更新接口使自己的状态与被观察者的状态一致。在这个角色内可以维护指向被观察者对象的引用。
适用性:
在以下任一情况下可以使用观察者模式:
1、当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将二者封装在独立的对象中以使它们可以各自独立的改变和复用。
2、当对一个对象的改变需要同时改变其它对象,而不知道具体有多少个其它对象。
3、当一个对象必须通知其它对象,而它又不能假定其它对象是谁。你不希望这些对象是紧密耦合的。
类图:
例子:
package yz.observer; /** * 抽象观察者 * @包名 yz.observer * @文件名 Observer.java * @作者 yz * @创建日期 2015-3-27 */ public abstract class Observer { public abstract void update(); }
package yz.observer; import java.util.ArrayList; import java.util.List; /** * 抽象被观察者 * * @包名 yz.observer * @文件名 Subject.java * @作者 yz * @创建日期 2015-3-27 */ public abstract class Subject { public List<Observer> observer=new ArrayList<Observer>(); public String state; public void attach(Observer obj) { observer.add(obj); } public void detach(Observer obj) { observer.remove(obj); } public void myNotify() { for(Observer temp:observer){ temp.update(); } } public String getState() { return state; } public void setState(String state) { this.state = state; } }
package yz.observer; /** * 具体被观察者 * @包名 yz.observer * @文件名 SubjectImpl.java * @作者 yz * @创建日期 2015-3-27 */ public class ConcreteSubject extends Subject{ }
package yz.observer; /** * 具体观察者 * @包名 yz.observer * @文件名 ObserverImpl.java * @作者 yz * @创建日期 2015-3-27 */ public class ConcreteObserver extends Observer{ public Subject subject; public String arg; public ConcreteObserver(Subject subject,String arg) { this.arg=arg; this.subject=subject; } @Override public void update() { System.out.println(arg+":"+subject.getState()); } }
package yz.observer; /** * 测试 * @包名 yz.observer * @文件名 Test.java * @作者 yz * @创建日期 2015-3-27 */ public class Test { public static void main(String[] args) { Subject s=new ConcreteSubject(); s.attach(new ConcreteObserver(s,"观察者A")); s.attach(new ConcreteObserver(s,"观察者B")); s.attach(new ConcreteObserver(s,"观察者C")); s.setState("被观察者的状态发送了变化"); s.myNotify(); } }
执行输出:
观察者A:被观察者的状态发送了变化
观察者B:被观察者的状态发送了变化
观察者C:被观察者的状态发送了变化
本文固定链接:http://www.yizhi227.com/?post=42
本文由Jessie原创或编辑,互联分享,尊重版权,转载请以链接形式标明本文地址
本文由Jessie原创或编辑,互联分享,尊重版权,转载请以链接形式标明本文地址