设计模式-观察者模式

观察者模式:一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。


观察者模式结构:

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


输出:
显示框架
事件具体处理:通知,参数
======================
显示框架
事件具体处理:通知,参数
-------------------------通知,参数



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值