package com.event.src;
import java.util.EventObject;
/**
* 事件:要想成爲一個事件,這個類必須繼承ExentObject
* @author winter
*/
@SuppressWarnings("serial")
public class NameChangeEvent extends EventObject {
/**
* 必須重寫EventObject類的構造方法
* @param source
*/
public NameChangeEvent(NameChangeContext source) {
super(source);
}
public NameChangeContext getNameChangeContext () {
return (NameChangeContext) super.getSource();
}
}
package com.event.src;
import java.util.EventListener;
/**
* 名字改變事件監聽器:繼承EventListener接口
* 讀完Servlet的監聽器源碼後,發現監聽器一般是接口。
* @author winter
*
*/
public interface NameChangeListener extends EventListener {
/**
* 名字事件改變後
* @param event
*/
public void changed(NameChangeEvent event);
}
package com.event.src;
import java.util.ArrayList;
import java.util.List;
/**
* 事件源
* @author winter
*
*/
public class NameChangeContext {
private String name="";
/**
* 一個事件可以有多個事件監聽器,所以這裏一般用list裝起事件監聽器來
*/
private List<NameChangeListener> listeners=new ArrayList<NameChangeListener>();
public String getName() {
return name;
}
/**
* 當名字改變時,響應事件
* @param name
*/
public void setName(String name) {
if(!this.name.equals(name)){
this.name = name;
notifies();
}
}
/**
* 註冊事件
* @param listener
*/
public void addListener(NameChangeListener listener){
listeners.add(listener);
}
/**
* 響應事件
*/
public void notifies(){
for (NameChangeListener listener : listeners) {
listener.changed(new NameChangeEvent(this));
}
}
}
package com.event.main;
import com.event.src.NameChangeContext;
import com.event.src.NameChangeEvent;
import com.event.src.NameChangeListener;
/**
* 測試
* @author winter
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
NameChangeContext context=new NameChangeContext();
context.addListener(new NameChangeListener() {
@Override
public void changed(NameChangeEvent event) {
System.out.println("名字改變啦,改成:"+event.getNameChangeContext().getName());
}
});
context.setName("劉敏");
}
}