观察者模式:一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
观察者模式结构:
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();
}
}
输出:
显示框架
事件具体处理:通知,参数
======================
显示框架
事件具体处理:通知,参数
-------------------------通知,参数