观察者模式定义:定义对象间的一种一对多的依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新
观察者模式本质:触发联动
参考:http://chjavach.iteye.com/blog/1632211,研磨设计模式(书籍),大话设计模式(书籍)
模式图:
待补充
(1)目标对象,被观察者(Target.java)
package com.mcc.core.designPattern.behavior.observer.dragObserver; import java.util.ArrayList; import java.util.List; /** * 目标对象,被观察者 * * @author menergy * DateTime: 14-3-15 下午3:32 */ public class Target { //持有所有注册的观察者对象 private List //增加观察者对象 public void addObserver(Observer observer){ observerList.add(observer); } //移除观察者对象 public void removeObserver(Observer observer){ observerList.remove(observer); } /** * 通知所有注册的观察者对象 */ protected void notifyObservers(){ for(Observer observer : observerList){ observer.update(this); } } } |
(2)目标对象子类(TargetExtends.java)
package com.mcc.core.designPattern.behavior.observer.dragObserver; /** * 目标对象子类,被观察者,管理状态变化 * * @author menergy * DateTime: 14-3-15 下午3:43 */ public class TargetExtends extends Target { //目标对象状态 private String targetState; public String getTargetState() { return targetState; } public void setTargetState(String targetState) { this.targetState = targetState; //状态发生了变化,通知各观察者对象 this.notifyObservers(); } } |
(3)观察者接口(Observer.java)
package com.mcc.core.designPattern.behavior.observer.dragObserver; /** * 观察者接口,拉模型,主动权为观察者,被观察者负责通知状态改变 * * 观察者模式的定义:定义对象间的一种一对多的依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新 * 观察者模式的本质:触发联动 * * @author menergy * DateTime: 14-3-15 下午3:35 */ public interface Observer { /** * 目标对象,更新观察结果,可加入其它操作 * @param target */ public void update(Target target); } |
(4)观察者A(ObserverImplA.java)
package com.mcc.core.designPattern.behavior.observer.dragObserver; /** * 观察者A * * @author menergy * DateTime: 14-3-15 下午3:48 */ public class ObserverImplA implements Observer { /** * 拉模型,观察者感应到目标对象发生变化,消息必须自己去获取 * @param target */ @Override public void update(Target target) { System.out.println("观察者A收到目标状态信息:" +((TargetExtends)target).getTargetState()+ ",执行相应操作"); } } |
(5)观察者B(ObserverImplB.java)
package com.mcc.core.designPattern.behavior.observer.dragObserver; /** * 观察者B * * @author menergy * DateTime: 14-3-15 下午3:58 */ public class ObserverImplB implements Observer { /** * 拉模型,观察者感应到目标对象发生变化,消息必须自己去获取 * @param target */ @Override public void update(Target target) { System.out.println("观察者B收到目标状态信息:" +((TargetExtends)target).getTargetState()+ ",执行相应操作"); } } |
(6)客户端测试(Client.java)
package com.mcc.core.designPattern.behavior.observer.dragObserver; /** * 客户端测试 * * @author menergy * DateTime: 14-3-15 下午3:58 */ public class Client { public static void main(String args[]){ //目标对象,被观察者 TargetExtends target = new TargetExtends(); //观察者 Observer observerA = new ObserverImplA(); Observer observerB = new ObserverImplB(); //注册观察者 target.addObserver(observerA); target.addObserver(observerB); //被观察者更新状态 target.setTargetState("【已经发布,请查收】"); } } |
(1)目标对象,被观察者(Target.java)
package com.mcc.core.designPattern.behavior.observer.pushObserver; import java.util.ArrayList; import java.util.List; /** * 目标对象,被观察者 * * @author menergy * DateTime: 14-3-15 下午3:32 */ public class Target { //持有所有注册的观察者对象 private List //增加观察者对象 public void addObserver(Observer observer){ observerList.add(observer); } //移除观察者对象 public void removeObserver(Observer observer){ observerList.remove(observer); } /** * 通知所有注册的观察者对象 */ protected void notifyObservers(String message){ for(Observer observer : observerList){ observer.update(message); } } } |
(2)目标对象子类(TargetExtends.java)
package com.mcc.core.designPattern.behavior.observer.pushObserver; /** * 目标对象子类,被观察者,管理状态变化 * * @author menergy * DateTime: 14-3-15 下午3:43 */ public class TargetExtends extends Target { //消息 private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; //通知并推送消息给观察者 this.notifyObservers(message); } } |
(3)观察者接口(Observer.java)
package com.mcc.core.designPattern.behavior.observer.pushObserver; /** * 观察者接口,推模型,主动权为目标对象 * * 观察者模式的定义: * * @author menergy * DateTime: 14-3-15 下午3:35 */ public interface Observer { /** * 目标对象,更新观察结果,可加入其它操作 * @param message 推送的消息 */ public void update(String message); } |
(4)观察者A(ObserverImplA.java)
package com.mcc.core.designPattern.behavior.observer.pushObserver; /** * 观察者A * * @author menergy * DateTime: 14-3-15 下午3:48 */ public class ObserverImplA implements Observer { /** * 推模型,消息直接被目标对象推送过来 * @param message */ @Override public void update(String message) { System.out.println("观察者A收到推送过来的消息:" + message + ",执行相应操作"); } } |
(5)观察者B(ObserverImplB.java)
package com.mcc.core.designPattern.behavior.observer.pushObserver; /** * 观察者B * * @author menergy * DateTime: 14-3-15 下午3:58 */ public class ObserverImplB implements Observer { /** * 推模型,消息直接被目标对象推送过来 * @param message */ @Override public void update(String message) { System.out.println("观察者B收到推送过来的消息:" + message + ",执行相应操作"); } } |
(6)客户端测试(Client.java)
package com.mcc.core.designPattern.behavior.observer.pushObserver; /** * 客户端测试 * * @author menergy * DateTime: 14-3-15 下午3:58 */ public class Client { public static void main(String args[]){ //目标对象,被观察者 TargetExtends target = new TargetExtends(); //观察者 Observer observerA = new ObserverImplA(); Observer observerB = new ObserverImplB(); //注册观察者 target.addObserver(observerA); target.addObserver(observerB); //推送消息 target.setMessage("【消息:今天会议取消】"); } } |
(1)目标对象(Targeter.java)
package com.mcc.core.designPattern.behavior.observer.javaObserver; import java.util.Observable; /** * 目标对象,java方式实现 * * @author menergy * DateTime: 14-3-15 下午4:23 */ public class Targeter extends Observable { //消息 private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; //设置状态,java自带实现 this.setChanged(); //主动通知观察者,java自带实现,推方式 this.notifyObservers(this.message); // //主动通知观察者,java自带实现,拉方式 // this.notifyObservers(); } } |
(2)观察者A(ObserverA.java)
package com.mcc.core.designPattern.behavior.observer.javaObserver; import java.util.Observable; import java.util.Observer; /** * 观察者A,java实现方式 * * @author menergy * DateTime: 14-3-15 下午4:29 */ public class ObserverA implements Observer { /** * 处理更新 * @param o * @param arg */ @Override public void update(Observable o, Object arg) { //推方式需要在目标对象中调用notifyObservers带参数的方法,否则这里的org会是null System.out.println("观察者A收到推送过来的消息:" + arg + ",执行相应操作"); //拉方式是默认的模型,目标对象中调用有参数或无参数的notifyObservers都可以 System.out.println("观察者A拉到消息:" + ((Targeter)o).getMessage() + ",执行相应操作"); } } |
(3)观察者B(ObserverB.java)
package com.mcc.core.designPattern.behavior.observer.javaObserver; import java.util.Observable; import java.util.Observer; /** * 观察者B,java实现方式 * * @author menergy * DateTime: 14-3-15 下午4:44 */ public class ObserverB implements Observer { /** * 处理更新 * @param o * @param arg */ @Override public void update(Observable o, Object arg) { //推方式需要在目标对象中调用notifyObservers带参数的方法,否则这里的org会是null System.out.println("观察者B收到推送过来的消息:" + arg + ",执行相应操作"); //拉方式是默认的模型,目标对象中调用有参数或无参数的notifyObservers都可以 System.out.println("观察者B拉到消息:" + ((Targeter)o).getMessage() + ",执行相应操作"); } } |
(4)客户端测试(Client.java)
package com.mcc.core.designPattern.behavior.observer.javaObserver; /** * 客户端测试 * * @author menergy * DateTime: 14-3-15 下午4:45 */ public class Client { public static void main(String args[]){ //目标对象,被观察者 Targeter targeter = new Targeter(); //观察者 ObserverA observerA = new ObserverA(); ObserverB observerB = new ObserverB(); //注册观察者 targeter.addObserver(observerA); targeter.addObserver(observerB); //推送消息 targeter.setMessage("【消息:今天会议取消】"); } } |