/*
* 监听者(观察者)设计模式包含的要素:
* 1) 被监听者(事件源) ---btn(Button类) 由它注册(添加)监听者
* 2) 监听者(监听器) ----obj(实现监听器接口的类对象)
* 3) 事件对象 ----e(封装了事件源的对象,根据需求还可包含事件相关的其它信息)
*
*/
/被监听者
public class Cat {
//被监听行为
public void climb(){
System.out.println("猫开始爬.....");
for(ICatListener listener: list){
CatEvent e = new CatEvent(this); //在e中封装一些想给监听者使用的信息
listener.climbing( e );
}
}
private List<ICatListener> list = new ArrayList<ICatListener>();
//提供注册监听器
public void addICatListener(ICatListener listener){
list.add(listener);
}
}
//
//监听器(监听者将要实现这个接口)
public interface ICatListener {
public void climbing(CatEvent e);
}
//
public class CatEvent {
private Object srcObj;
public CatEvent(Object srcObj) {
this.srcObj = srcObj;
//
//测试(使用)别人用监听者设计模式开发出的模块
public class TestV2 {
public static void main(String[] args) {
Cat cat = new Cat();
//注册监听者
cat.addICatListener( new ICatListener() {
@Override
public void climbing(CatEvent e) {
System.out.println("看到猫爬...做出相应行为");
System.out.println("所监听到的事件源(被监听者):"+e.getSource());
}
});
cat.climb();
}
}
}
public Object getSource(){
return srcObj;
}
}
关于btn监听的典型示例
public class MyFrame extends Frame {
public MyFrame() {
setBounds(50,50,400,300);
setLayout(new FlowLayout());
Button btn = new Button("ok");
add(btn);
A obj = new A();
btn.addActionListener(obj);
setVisible(true);
}
public static void main(String[] args) {
new MyFrame();
}
}
class A implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("我听到了:"+e.getSource());
}
}