观察者模式也叫做发布订阅模式,定义对象间一对多的依懒关系,使得每当一个对象状态改变,所有依懒于它的对象都会得到通知并被自动更新。

 

关键代码:在抽象类里有一个 ArrayList 存放观察者们。

 

示例代码:

 

/**

 * 被观察者抽象类

 */

public abstract class Subject {

 

// 观察者列表,vector是线程安全的

private Vector<Observer> observerVector = new Vector<Observer>();

 

// 增加观察者

public void addObserver(Observer observer) {

this.observerVector.add(observer);

}

 

// 删除观察者

public void removeObserver(Observer observer) {

this.observerVector.remove(observer);

}

 

// 通知所有观察者

public void notifyObservers(String info) {

for (Observer observer : this.observerVector) {

observer.update(info);

}

}

}

 

/**

 * 观察者接口

 */

public interface Observer {

 

public void update(String info);

}

 

 

/**

 * 真实的被观察者

 */

public class RealSubject extends Subject {

 

public void operate() {

System.out.println("被观察者有行动了");

String info = "我在玩游戏";

super.notifyObservers(info);

}

}

 

/**

 * 真实的观察者

 */

public class RealObserver implements Observer {

 

@Override

public void update(String info) {

System.out.println("观察者接收到消息:" + info);

}

 

}

 

测试代码:

 

/**

 * 测试观察者模式

 */

public class TestObserver {

 

public static void main(String[] args) {

RealSubject subject = new RealSubject();

Observer observer = new RealObserver();

subject.addObserver(observer);

subject.operate();

}

}

 

运行结果:

 

被观察者有行动了

观察者接收到消息:我在玩游戏

 

二、用jdk自带的观察者接口的示例代码

 

/**

 * 使用jdk自带的Observer接口

 */

public class RealSubject extends Observable {

public void operate() {

System.out.println("被观察者有行动了");

String info = "我在玩游戏";

super.setChanged(); // 触发变化

super.notifyObservers(info);

}

}

 

public class RealObserver implements Observer {

 

@Override

public void update(Observable o, Object arg) {

System.out.println("观察者接收到消息:" + arg.toString());

}

 

}

 

测试代码:

 

public class Test {

public static void main(String[] args) {

RealSubject subject = new RealSubject();

RealObserver observer = new RealObserver();

subject.addObserver(observer);

subject.operate();

}

}


运行结果:

 

被观察者有行动了

观察者接收到消息:我在玩游戏


观察者模式大量的应用在消息队列的处理机制中。

 

设计模式之观察者模式_Java

 

设计模式之观察者模式_Java_02