java设计模式(行为型)之观察者模式
2014-03-17 18:13
459 查看
第0章:简介
观察者模式定义:定义对象间的一种一对多的依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新观察者模式本质:触发联动
参考:http://chjavach.iteye.com/blog/1632211,研磨设计模式(书籍),大话设计模式(书籍)
模式图:
待补充
第1章:实践
第0节:观察者模式(拉模式)
(1)目标对象,被观察者(Target.java)package com.mcc.core.designPattern.behavior.observer.dragObserver; import java.util.ArrayList; import java.util.List; /** * 目标对象,被观察者 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-15 下午3:32 */ public class Target { //持有所有注册的观察者对象 private List<Observer> observerList = new ArrayList<Observer>(); //增加观察者对象 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); } } } |
package com.mcc.core.designPattern.behavior.observer.dragObserver; /** * 目标对象子类,被观察者,管理状态变化 * * @author <a href="mailto:417877417@qq.com">menergy</a> * 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(); } } |
package com.mcc.core.designPattern.behavior.observer.dragObserver; /** * 观察者接口,拉模型,主动权为观察者,被观察者负责通知状态改变 * * 观察者模式的定义:定义对象间的一种一对多的依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新 * 观察者模式的本质:触发联动 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-15 下午3:35 */ public interface Observer { /** * 目标对象,更新观察结果,可加入其它操作 * @param target */ public void update(Target target); } |
package com.mcc.core.designPattern.behavior.observer.dragObserver; /** * 观察者A * * @author <a href="mailto:417877417@qq.com">menergy</a> * 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()+ ",执行相应操作"); } } |
package com.mcc.core.designPattern.behavior.observer.dragObserver; /** * 观察者B * * @author <a href="mailto:417877417@qq.com">menergy</a> * 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()+ ",执行相应操作"); } } |
package com.mcc.core.designPattern.behavior.observer.dragObserver; /** * 客户端测试 * * @author <a href="mailto:417877417@qq.com">menergy</a> * 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节:观察者模式(推模式)
(1)目标对象,被观察者(Target.java)package com.mcc.core.designPattern.behavior.observer.pushObserver; import java.util.ArrayList; import java.util.List; /** * 目标对象,被观察者 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-15 下午3:32 */ public class Target { //持有所有注册的观察者对象 private List<Observer> observerList = new ArrayList<Observer>(); //增加观察者对象 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); } } } |
package com.mcc.core.designPattern.behavior.observer.pushObserver; /** * 目标对象子类,被观察者,管理状态变化 * * @author <a href="mailto:417877417@qq.com">menergy</a> * 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); } } |
package com.mcc.core.designPattern.behavior.observer.pushObserver; /** * 观察者接口,推模型,主动权为目标对象 * * 观察者模式的定义: * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-15 下午3:35 */ public interface Observer { /** * 目标对象,更新观察结果,可加入其它操作 * @param message 推送的消息 */ public void update(String message); } |
package com.mcc.core.designPattern.behavior.observer.pushObserver; /** * 观察者A * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-15 下午3:48 */ public class ObserverImplA implements Observer { /** * 推模型,消息直接被目标对象推送过来 * @param message */ @Override public void update(String message) { System.out.println("观察者A收到推送过来的消息:" + message + ",执行相应操作"); } } |
package com.mcc.core.designPattern.behavior.observer.pushObserver; /** * 观察者B * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-15 下午3:58 */ public class ObserverImplB implements Observer { /** * 推模型,消息直接被目标对象推送过来 * @param message */ @Override public void update(String message) { System.out.println("观察者B收到推送过来的消息:" + message + ",执行相应操作"); } } |
package com.mcc.core.designPattern.behavior.observer.pushObserver; /** * 客户端测试 * * @author <a href="mailto:417877417@qq.com">menergy</a> * 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("【消息:今天会议取消】"); } } |
第2节:观察者模式(java自带)
(1)目标对象(Targeter.java)package com.mcc.core.designPattern.behavior.observer.javaObserver; import java.util.Observable; /** * 目标对象,java方式实现 * * @author <a href="mailto:417877417@qq.com">menergy</a> * 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(); } } |
package com.mcc.core.designPattern.behavior.observer.javaObserver; import java.util.Observable; import java.util.Observer; /** * 观察者A,java实现方式 * * @author <a href="mailto:417877417@qq.com">menergy</a> * 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() + ",执行相应操作"); } } |
package com.mcc.core.designPattern.behavior.observer.javaObserver; import java.util.Observable; import java.util.Observer; /** * 观察者B,java实现方式 * * @author <a href="mailto:417877417@qq.com">menergy</a> * 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() + ",执行相应操作"); } } |
package com.mcc.core.designPattern.behavior.observer.javaObserver; /** * 客户端测试 * * @author <a href="mailto:417877417@qq.com">menergy</a> * 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("【消息:今天会议取消】"); } } |
相关文章推荐
- java设计模式--行为型模式--状态模式
- 设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 状态模式(State Pattern) - Java实现
- 设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 模板方法模式(Template Method) - Java实现
- JAVA设计模式(21):行为型-迭代器模式(Iterator)
- 设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 策略模式(Strategy) - Java实现
- Java经典23种设计模式之行为型模式(二)
- JAVA设计模式(17):行为型-模板方法模式(Template Method)
- Java设计模式之行为型模式(中介者模式)
- Java设计模式_行为型_中介者模式_租个房子不过如此
- Java设计模式——观察者模式(事件监听)
- Java设计模式_行为型_解释器模式_加减法的运算
- java设计模式(行为型)之中介者模式
- JAVA设计模式(22):行为型-解释器模式(Interpreter)
- Java设计模式_(行为型)_策略模式
- java-设计模式(行为型)-【观察者模式】
- Java 23种设计模式详尽分析与实例解析之三--行为型模式
- JAVA设计模式--行为型模式(1)
- Java经典23种设计模式之行为型模式(四)
- Java经典设计模式-行为型模式-十一种(全)
- java设计模式之行为型模式