您的位置:首页 > 其它

设计模式之观察者模式

2012-01-06 10:27 232 查看
定义

一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知,即对象做了某个动作,多个观察者都会接收到触发,并选择做出各自的动作。

在观察者模式中,主要有:观察者对象、被观察对象。

观察者对象:负责自身动作的实施。

被观察对象:负责观察者的注册,删除,通知观察者。

观察者模式在消息调用方面用的很多,可以分离代码。

类图



具体实现代码

package com.observer;
/*
* 观察者接口
* */
public interface Observer {
void wakeUp();
}

package com.observer;
/*
* 观察者具体实现
*/
public class ConcreteObserver implements Observer {
private String name;
public ConcreteObserver(String name){
this.name = name;
}
@Override
public void wakeUp() {
System.out.println(name + ",please get up!");
}

}

package com.observer;
/*
* 被观察者接口
*/
public interface Subject {
void attach(Observer observer);
void detach(Observer observer);
void notifyObserver();
}

package com.observer;

import java.util.ArrayList;
import java.util.List;
/*
* 被观察者具体实现
*/
public class ConcreteSubject implements Subject {
private List<Observer> observerList = new ArrayList<Observer>();
/**
* 添加观察者对象
*/
@Override
public void attach(Observer observer) {
observerList.add(observer);
}

/**
* 移除观察者对象
* */
@Override
public void detach(Observer observer) {
observerList.remove(observer);
}

/**
* 触发观察者状态变化
*/
@Override
public void notifyObserver() {
for (Observer o : observerList) {
o.wakeUp();
}
}
}

package com.observer;
/**
* 观察模式的调用过程
*
*/
public class ClientTest {
public static void main(String[] args) {
//创建观察者对象
Observer zhangsan = new ConcreteObserver("zhangsan");
Observer lisi = new ConcreteObserver("lisi");
Observer wangwu = new ConcreteObserver("wangwu");

//注册观察者对象到被观察者中去
Subject subject = new ConcreteSubject();
subject.attach(zhangsan);
subject.attach(lisi);
subject.attach(wangwu);

System.out.println("------------触发观察者状态----------------");
//触发观察者状态
subject.notifyObserver();

System.out.println("------------将注册观察者对象从被观察者中移去----------------");
//将注册观察者对象从被观察者中移去
subject.detach(zhangsan);
subject.notifyObserver();
}
}
在jdk内部内置了观察者模式。其类为:java.util.Observer, java.util .Observable。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: