package pattern.observer;
/**
介绍:两种主要角色 :观察者(订阅者),被观察者(发布者)
当被观察者的状态发生改变时,可以及时通知观察者(观察者可以及时知道被观察者状态的改变)。
观察者可以有多个,要可以扩展(另外的观察者加入时方便)
好处:两种角色解耦,业务逻辑分离,每个角色只做自己该做的事儿。
添加或删除观察者也变得很容易。
Java观察者模式 (Observable,Observer)
被观察者 继承Observable,观察者 实现Observer
Observable中的两个变量,changed用来记录此对象是否发生改变,obs用来存放观察者对象,Vector可以使线程安全
private boolean changed = false;
private Vector obs;
void deleteObserver(Observer o);
void deleteObservers() ; //删除所有观察者
void setChanged(); //将changed状态置为 true;
void clearChanged(); //将changed状态置为 false;
void addObserver(Observer o);
boolean hasChanged(); //查看是否发生状态改变
int countObservers(); //查看观察者数目
/**
* 判断是否发生改变,如果发生改变,先修改状态,再通知其他观察者。
* 加锁的区域尽量小,只在需要加锁的地方加锁,不需要加锁的代码,可以拿出来
*/
notifyObservers(Object arg){
Object[] arrLocal;
synchronized (this) {
if (!changed)
return;
arrLocal = obs.toArray();
clearChanged();
}
for (int i = arrLocal.length-1; i>=0; i--)
((Observer)arrLocal[i]).update(this, arg);
}
实现Observer,需要实现void update(Observable o, Object arg); 这个方法是被观察者状态改变以后,通知观察者,观察者所做的动作
*/
import java.util.Observable;
/**
* @Author : haojiangt
* @Description : 观察者模式(发布订阅模式)
**/
public class Item extends Observable {
private String person;
public void get(){
System.out.println("wait a moment!");
//当person为girl时,状态发生改变,判断状态发生改变,通知观察者们,同时将观察到的事物告诉观察者们。
Long gender =System.currentTimeMillis()%2;
if(gender == 1){
person = "boy";
System.out.println("A "+ person + " coming");
}else{
person = "girl";
System.out.println("A "+ person + " coming");
setChanged();
}
System.out.println("There are "+this.countObservers()+" person(s)");
if(this.hasChanged()) {
notifyObservers(person);
}
}
}
package pattern.observer;
import java.util.Observable;
import java.util.Observer;
/**
* @Author : haojiangt
* @Description :
**/
public class ObserverTest implements Observer{
//重写update方法
@Override
public void update(Observable o, Object arg) {
String gender = (String) arg;
System.out.println("I watched a "+gender);
}
public static void main(String[] args){
Item item = new Item();
for(int i = 0; i < 5; i++){
ObserverTest observerTest = new ObserverTest();
item.addObserver(observerTest);
}
item.get();
}
}
本文介绍了观察者模式的基本概念,包括观察者(订阅者)和被观察者(发布者)两种主要角色。阐述了如何通过Java的Observable和Observer接口实现观察者模式,并提供了具体的代码实例,展示了如何在状态变化时通知所有观察者。
1270

被折叠的 条评论
为什么被折叠?



