您的位置:首页 > 编程语言 > Java开发

java实现观察者(Observer)模式

2011-01-29 00:20 459 查看
观察者模式:

将观察者与被观察着的对象分离,在模块之间进行区分,提高了程序的重用性、可维护性。

用代码实现时,观察者与被观察者之间的关系不能是直接调用,而应该是一种 注册 与 回调 的形式。

观察者实现一个接口,被观察者保存注册过的观察者的信息,当发生变化时,通过多态回调观察者的接口方法。

package Test;

import java.util.HashSet;

public class ObserverTry {
public static void main(String[] args){
Index i = new Index("数据指数",150);
Observer o1 = new AObserver();
Observer o2 = new BObserver();
i.addObserver(o1); //注册观察者
i.addObserver(o2);
System.out.println(" Count Up! ");
i.setCount(180);
o1.remove(i); //观察者o1取消观察
System.out.println(" Count Down! ");
i.setCount(120);
}
}

interface Observer{
public void update(Index i); //更新index
public void remove(Index i); //撤销注册
}

class AObserver implements Observer{
public void update(Index i){
System.out.println("A Name: " + i.getName() + " Count: " + i.getCount());
}
public void remove(Index i){
i.getObservers().remove(this);
}
}

class BObserver implements Observer{
public void update(Index i){
System.out.println("B Name: " + i.getName() + " Count: " + i.getCount());
}
public void remove(Index i){
i.getObservers().remove(this);
}
}

class Index{
private String name;
private int count;
private HashSet<Observer> observers; //保存所有的观察者

public Index(String name,int count){
this.name = name;
this.count = count;
observers = new HashSet<Observer>();
}

public void addObserver(Observer ob){
observers.add(ob); //添加观察者
}

public void notifyObserver(){
for(Observer ob:observers){
ob.update(this); //回调所有观察者的update方法
}
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getCount() {
return count;
}

public void setCount(int count) {
this.count = count;
notifyObserver(); //当count改变时,通知观察者
}

public HashSet<Observer> getObservers() {
return observers;
}

public void setObservers(HashSet<Observer> observers) {
this.observers = observers;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: