天天看點

監聽器Listener學習筆記1:監聽器設計模式1.理論知識2.示例代碼

1.理論知識

監聽器設計模式,是觀察者設計模式的一種實作,它不屬于23種設計模式之一

監聽器設計模式的一個被觀察者一般定義一個觀察者,也可以定義多個觀察者。被監聽者發送的資訊是一個對象,叫做事件。被監聽對象稱為事件源。對監聽器發送通知叫做觸發監聽器。

2.示例代碼

以被監聽者所執行的增删改查crud操作進行監聽為例

事件接口的代碼

package com.powernode.events;

import com.powernode.listenerable.IListenerable;

//定義增删改查事件
//C:create
//R:Retrieve  檢索
//U:update
//D:delete

//通常,對于事件對象,我們一般是需要從事件對象中擷取到事件源對象
public interface ICrudEvent {
	
	//聲明事件類型
	String CRE_EVENT="create event";
	String RET_EVENT="retrieve event";
	String UPD_EVENT="update event";
	String DEL_EVENT="delete event";
	
	//擷取事件源對象
    IListenerable  getEventSource();
	
	//擷取事件類型
      String getEventType();    
	
}
           

事件源接口的代碼

package com.powernode.listenerable;

import com.powernode.events.ICrudEvent;
import com.powernode.listeners.IListener;

//事件源接口
public interface IListenerable {
	//為事件源注冊監聽器
	void setListener(IListener listener);
	//觸發監聽器
	void triggerListener(ICrudEvent event);
}
           

監聽器接口的代碼

package com.powernode.listeners;

import com.powernode.events.ICrudEvent;

//監聽器接口
public interface IListener {

	//處理事件
	void handle(ICrudEvent event);
	
	
}
           

事件的實作類

package com.powernode.events;

import com.powernode.listenerable.IListenerable;

//定義事件類
public class CrudEvent implements ICrudEvent {
private IListenerable eventSource;  //事件源
private String methodName;         //事件源所執行的方法名稱


	public CrudEvent(IListenerable eventSource,String methodName) {
	super();
	this.eventSource = eventSource;
	this.methodName=methodName;
}

	@Override
	public IListenerable getEventSource() {
		return eventSource;
	}

//根據事件源所執行的不同的方法,傳回不同的事件類型	
	@Override
	public String getEventType() {
		String eventType=null;
		 if (methodName.startsWith("save")) {
			 eventType=CRE_EVENT;
		} else if (methodName.startsWith("remove")) {
			 eventType=DEL_EVENT;
		}else if (methodName.startsWith("modify")) {
			 eventType=UPD_EVENT;
		}else if (methodName.startsWith("retrieve")) {
			 eventType=RET_EVENT;
		}else {
			eventType="have not this event type";
		}
		
		return eventType;
	}

}
           

監聽器的類

package com.powernode.listeners;

import com.powernode.events.ICrudEvent;

//定義監聽器類
public class CrudListener implements IListener {

	@Override
	public void handle(ICrudEvent event) {
			String eventType=event.getEventType();
			if (ICrudEvent.CRE_EVENT.equals(eventType)) {
				System.out.println("事件源執行了 添加 操作");
			} else if (ICrudEvent.DEL_EVENT.equals(eventType)) {
				System.out.println("事件源執行了 删除 操作");
			}else if (ICrudEvent.UPD_EVENT .equals(eventType)) {
				System.out.println("事件源執行了 修改 操作");
			}else if (ICrudEvent.RET_EVENT.equals(eventType)) {
				System.out.println("事件源執行了 查詢 操作");
			}
	}

}
           

事件源的類

package com.powernode.listenerable;

import com.powernode.events.ICrudEvent;
import com.powernode.listeners.IListener;

//定義事件源類
public class Some implements IListenerable {

	private IListener listener;
	
	//注冊監聽器
	@Override
	public void setListener(IListener listener) {
          this.listener=listener;
	}

	//觸發監聽器
	@Override
	public void triggerListener(ICrudEvent event) {

		listener.handle(event);
	}

}
           

測試代碼

package com.powernode.test;

import com.powernode.events.CrudEvent;
import com.powernode.events.ICrudEvent;
import com.powernode.listenerable.Some;
import com.powernode.listeners.CrudListener;
import com.powernode.listeners.IListener;

public class MyTest {

	public static  void main(String[] args) {
	//定義監聽器
	IListener listener=new CrudListener();
	
	//定義事件源
	Some some=new Some();
	
	//定義事件
	ICrudEvent event=new CrudEvent(some, "saveStudent");
	
	//注冊監聽器
	some.setListener(listener);
	
	//觸發監聽器
	   some.triggerListener(event);
	
}
}
           

更真實的監聽器

事件源的代碼

package com.powernode.listenerable;

import com.powernode.events.CrudEvent;
import com.powernode.events.ICrudEvent;
import com.powernode.listeners.IListener;

//定義事件源類
public class Some implements IListenerable {

	private IListener listener;
	
	//注冊監聽器
	@Override
	public void setListener(IListener listener) {
          this.listener=listener;
	}

	//觸發監聽器
	@Override
	public void triggerListener(ICrudEvent event) {

		listener.handle(event);
	}
	
	
	//下面的方式是事件源類真正的業務邏輯,而監聽器監聽的就是這些業務方法的執行
	public void saveStudent() {
		
		System.out.println("向DB中添加了一條資料");
		ICrudEvent event =new CrudEvent(this, "saveStudent");
		this.triggerListener(event);
		
	}

	
	public void deleteStudent() {
		
		System.out.println("向DB中  删除  了一條資料");
		ICrudEvent event =new CrudEvent(this, "deleteStudent");
		this.triggerListener(event);
		
	}


    public void updateStudent() {
		
		System.out.println("向DB中  修改  了一條資料");
		ICrudEvent event =new CrudEvent(this, "updateStudent");
		this.triggerListener(event);
		
	}
	
	
	
    public void findStudent() {
		
		System.out.println("向DB中  查詢  了一條資料");
		ICrudEvent event =new CrudEvent(this, "findStudent");
		this.triggerListener(event);
		
	}
}
           

測試代碼

package com.powernode.test;

import com.powernode.events.CrudEvent;
import com.powernode.events.ICrudEvent;
import com.powernode.listenerable.Some;
import com.powernode.listeners.CrudListener;
import com.powernode.listeners.IListener;

public class MyTest {

	public static  void main(String[] args) {
	//定義監聽器
	IListener listener=new CrudListener();
	
	//定義事件源
	Some some=new Some();
	
	//定義事件
	ICrudEvent event=new CrudEvent(some, "saveStudent");
	
	//注冊監聽器
	some.setListener(listener);
	
	//事件源執行自己的業務方法
	   some.saveStudent();
	   some.deleteStudent();
	   some.updateStudent();
	   some.findStudent();
	
}
}
           

繼續閱讀