监听的接口: 3个待实现的方法
public interface Subject {
public void attach(Observer observer);
public void detach(Observer observer);
void notifyObservers();
}
监听的类: 3个方法, 添加,删除, 通知。
(每次通知的时候,会遍历容器内的对象,调用容器内对象的update方法【当然,对象可以是实体也可以(通常)是匿名内部类的匿名对象】)
public class ConcreteSubject implements Subject {
Vector<Observer> observersVector = new Vector<Observer>();
public void attach(Observer observer){
observersVector.addElement(observer);
}
public void detach(Observer observer){
observersVector.removeElement(observer);
}
public void notifyObservers(){
Enumeration enumeration = observers();
while (enumeration.hasMoreElements()){
((Observer)enumeration.nextElement()).update();
}
}
public Enumeration observers(){
return ((Vector) observersVector.clone()).elements();
}
}
被监听的对象需要实现的接口
public interface Observer {
void update();
}
用对象或者匿名对象去实现这个方法,启动需要做的事情。
public class ConcreteObserver implements Observer {
@Override
public void update() {
// TODO Auto-generated method stub
System.out.println("这里是实现,调用实现Observer接口的对象通知时触发");
}
}
或者:
new Observer() {
public void update() {
// TODO Auto-generated method stub
System.out.println("aas");
}
});
最后自己测试下:
监听,通知, 去掉一个,再通知。
public class Main_ {
public static void main(String args[]){
ConcreteSubject mConcreteSubject = new ConcreteSubject();
mConcreteSubject.attach(new Observer() {
public void update() {
// TODO Auto-generated method stub
System.out.println("匿名内部类的匿名对象的实现");
}
});
ConcreteObserver mConcreteObserver = new ConcreteObserver();
mConcreteSubject.attach(mConcreteObserver);
mConcreteSubject.notifyObservers();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mConcreteSubject.detach(mConcreteObserver);
mConcreteSubject.notifyObservers();
}
}