您的位置:首页 > 其它

设计模式-观察者模式

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();
}

观察者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();
}
}


输出:
显示框架
事件具体处理:通知,参数
======================
显示框架
事件具体处理:通知,参数
-------------------------通知,参数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: