设计模式-观察者模式
2016-07-08 21:01
316 查看
观察者模式:一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
观察者模式结构:
Target:(抽象类)
属性:
单个或一组(集合)观察者
自身状态,可以一个标记或一组状态值
方法:
自身状态管理
观察者管理
通知观察者.
Observe:(观察者):
方法:
当target类状态发生改变后的一些逻辑处理。
观察者模式可以形成链式.
案例,模拟jdk自身AWT事件监听。
代码如下:
被观察者(FRAME)
package com.bo.observe;
import java.util.Vector;
public abstract class AFrame {
private Vector<IListener> listeners = new Vector<>();
private boolean isChanged = false;
public final void setChanged() {
this.isChanged =true;
}
public final void clearChanged(){
this.isChanged = false;
}
public final boolean hasChanged(){
return this.isChanged;
}
public final void addListener(IListener listener){
this.listeners.addElement(listener);
}
public final void removeListener(IListener listener){
this.listeners.remove(listener);
}
public final void notifyListener(){
this.notifyListener(null);
}
public final void notifyListener(Object param){
for (IListener iListener : listeners) {
iListener.triggerEventHandler(this, param);
}
this.clearChanged();
}
public abstract void show();
}
观察者模式结构:
Target:(抽象类)
属性:
单个或一组(集合)观察者
自身状态,可以一个标记或一组状态值
方法:
自身状态管理
观察者管理
通知观察者.
Observe:(观察者):
方法:
当target类状态发生改变后的一些逻辑处理。
观察者模式可以形成链式.
案例,模拟jdk自身AWT事件监听。
代码如下:
被观察者(FRAME)
package com.bo.observe;
import java.util.Vector;
public abstract class AFrame {
private Vector<IListener> listeners = new Vector<>();
private boolean isChanged = false;
public final void setChanged() {
this.isChanged =true;
}
public final void clearChanged(){
this.isChanged = false;
}
public final boolean hasChanged(){
return this.isChanged;
}
public final void addListener(IListener listener){
this.listeners.addElement(listener);
}
public final void removeListener(IListener listener){
this.listeners.remove(listener);
}
public final void notifyListener(){
this.notifyListener(null);
}
public final void notifyListener(Object param){
for (IListener iListener : listeners) {
iListener.triggerEventHandler(this, param);
}
this.clearChanged();
}
public abstract void show();
}
观察者IListener package com.bo.observe; public interface IListener { public void triggerEventHandler(AFrame frame,Object para); }
观察者抽象(AListener)实现: package com.bo.observe; public abstract class AListener implements IListener { IEvent evnet; public AListener(){} public AListener(IEvent event){} public final IListener bindEvent(IEvent evnet){ this.evnet = evnet; return this; } public final IListener cancleEvent(IEvent event){ this.evnet = null; return this; } }
被观察者状态变化所对应的业务逻辑处理(IEvent), package com.bo.observe; public interface IEvent { public void handler(Object o); }
监听具体实现类一: package com.bo.observe; public class MouseClickListener extends AListener { public MouseClickListener(){} public MouseClickListener(IEvent event){} @Override public void triggerEventHandler(AFrame frame, Object para) { // TODO Auto-generated method stub if(frame.hasChanged()){ this.evnet.handler(para); } } }
测试类: package com.bo.observe; /** * 模拟AWT事件监听 * @author 波 * */ public class TestMain { public static void main(String[] args) { AFrame frame = new Frame(); frame.addListener(new MouseClickListener().bindEvent(new IEvent() { @Override public void handler(Object o) { // TODO Auto-generated method stub System.out.println("事件具体处理:"+o.toString()); } })); frame.show(); System.out.println("======================"); frame.addListener(new AListener() { @Override public void triggerEventHandler(AFrame frame, Object para) { // TODO Auto-generated method stub if(frame.hasChanged()){ this.evnet.handler(para); } } }.bindEvent(new IEvent() { @Override public void handler(Object o) { // TODO Auto-generated method stub System.out.println("-------------------------"+o.toString()); } })); frame.show(); } }
输出: 显示框架 事件具体处理:通知,参数 ====================== 显示框架 事件具体处理:通知,参数 -------------------------通知,参数
相关文章推荐
- 利用分支限界法求解单源最短路(Dijkstra)问题
- 把图片导入到canvas
- JAVA并发编程的一些整理
- Android 来电(包括铃声),短信拦截的实现方法
- 第1章 Java程序设计概述
- OS X自带数码测色计的使用
- bzoj3223 文艺平衡树 (treap or splay分裂+合并)
- bzoj3223 文艺平衡树
- 基于回溯法寻找哈密顿回路
- 安装Python
- SQL2008R2 导出表 成dbf文件,网上很多文档,但是真正能执行生成dbf文件的不多,我整理了一下:
- button和sumbit提交表单的区别
- HDU3874 Necklace[树状数组]
- 最近学的一些东西
- Ubuntu——"xxx is not in the sudoers file.This incident will be reported" 错误解决方法
- 【算法学习】归并排序——基于分治思想
- linux/ubuntu中制作deb安装包
- 浅谈TCP/IP协议栈(五)路由分类和路由优先级
- 微信支付V3版本地签名统一下单android端详解
- 我的JAVA学习之路