转自:http://blog.csdn.net/zhengzhb/article/details/7471978
。
/*******************************************************************************
* Copyright (c) 2015, 2015 Hirain Technologies Corporation.
******************************************************************************/
package qqq;
import java.util.Vector;
/**
* @Created Sep 26, 2015 10:53:17 AM
* @Description
* <p>
* 抽象主题类:被观察者
*/
abstract class Subject {
/**
* 一般一个被观察者拥有多个观察者,之所以使用Vector而不使用List,
* 是因为多线程操作时,Vector在是安全的,而List则是不安全的
*/
private final Vector<Observer> obs = new Vector<Observer>();
/**
* @param obs
* 添加的观察者
*/
public void addObserver(final Observer obs) {
this.obs.add(obs);
}
/**
* @param obs
* 移除的观察者
*/
public void delObserver(final Observer obs) {
this.obs.remove(obs);
}
/**
* 依次通知所有观察者
*/
protected void notifyObserver() {
for (final Observer o : obs) {
o.update();// 被观察者发生变化时,通知所有观察者;观察者接到通知后,在此做相应处理
}
}
/**
* 抽象主题类(被观察者)的具体实现类需要实现此抽象方法,
* 被观察者做完自己的时间后,notifyObserver()方法通知所有观察者
*/
public abstract void doSomething();
}
/*******************************************************************************
* Copyright (c) 2015, 2015 Hirain Technologies Corporation.
******************************************************************************/
package qqq;
/**
* @Created Sep 26, 2015 10:54:19 AM
* @Description
* <p>
* 抽象主题类(被观察者)的具体实现类
*/
class ConcreteSubject extends Subject {
@Override
public void doSomething() {
System.out.println("被观察者事件反生");// 被观察者做完这件事后,需要通知所有观察者我做了这件事
notifyObserver();// 依次通知所有观察者
}
}
/*******************************************************************************
* Copyright (c) 2015, 2015 Hirain Technologies Corporation.
******************************************************************************/
package qqq;
/**
* @Created Sep 26, 2015 10:54:43 AM
* @Description
* <p>
* 观察者接口
*/
interface Observer {
/**
* 被观察者发生变化时,通知所有观察者;观察者接到通知后,在此做相应处理
*/
public void update();
}
/*******************************************************************************
* Copyright (c) 2015, 2015 Hirain Technologies Corporation.
******************************************************************************/
package qqq;
/**
* @Created Sep 26, 2015 10:55:04 AM
* @Description
* <p>
* 观察者接口的 一个 具体实现类
*/
class ConcreteObserver1 implements Observer {
@Override
public void update() {// 被观察者发生变化时,通知所有观察者;观察者接到通知后,在此做相应处理
System.out.println("观察者1收到信息,并进行处理。");
}
}
/*******************************************************************************
* Copyright (c) 2015, 2015 Hirain Technologies Corporation.
******************************************************************************/
package qqq;
/**
* @Created Sep 26, 2015 10:55:21 AM
* @Description
* <p>
* 观察者接口的 一个 具体实现类
*/
class ConcreteObserver2 implements Observer {
@Override
public void update() {// 被观察者发生变化时,通知所有观察者;观察者接到通知后,在此做相应处理
System.out.println("观察者2收到信息,并进行处理。");
}
}
/*******************************************************************************
* Copyright (c) 2015, 2015 Hirain Technologies Corporation.
******************************************************************************/
package qqq;
/**
* @Created Sep 26, 2015 10:55:41 AM
* @Description
* <p>
* 测试类
*/
public class Test {
public static void main(final String[] args) {
final Subject sub = new ConcreteSubject();// 定义一个被观察者
sub.addObserver(new ConcreteObserver1()); // 添加观察者1
sub.addObserver(new ConcreteObserver2()); // 添加观察者2
sub.doSomething();// doSomething()内部有notifyObserver()方法去通知所有观察者
}
}
OK。