观察者模式通俗点讲相当于一个电台广播。打开收音机,找到电台这叫注册,离开电台叫注销,从电台听到的栏目就叫更新内容。内容对于注册了的用户时时更新,对于没有注册和已经注销了的用户也没有什么作用。
电台又可以叫做主题,打开电台的人可以叫做观察者。那么可以总结出主题具有更新内容的事件,而观察者可以注册、注销的事件。
对于一个主题,可以按照如下去设计代码:
通过使用接口我们可以更方便的扩展。
java中其实已经实现了观察者模式,上面代码中的Subject相当于java.util中的observerable类,Observer相当于java.util中的observer接口。
电台又可以叫做主题,打开电台的人可以叫做观察者。那么可以总结出主题具有更新内容的事件,而观察者可以注册、注销的事件。
对于一个主题,可以按照如下去设计代码:
// 主题
public interface Subject{
public void registerObservers(Observer o);
public void removeObservers(Observer o);
public void notifyObservers();
}
// 观察者
pubilc interface Observer{
public void update(String name,boolean sex);
}
// 观察者行为
public interface DisplayElement{
public void display();
}
通过使用接口我们可以更方便的扩展。
public class Thread implements Subject{
private String name;
private boolean sex;
private List<Observer> obList;
public Thread(){
obList = new ArrayList(Observer)();
}
@override
public void registerObservers(Observer o){
obList.add(o);
}
@override
public void removeObservers(Observer o){
int index = obList.getIndex(o);
if(index>=0){
obList.remove(index);
}
}
public void notifyObservers(){
for(Observer obs : obList){
obs.update(name,sex);
}
}
public void updateThreadProperty(String name,boolean sex){
this.name = name;
this.sex = sex;
notifyObservers();
}
}
public class ObserverPerson implements Observer,DisplayElement{
private String name;
private boolean sex;
public ObserverPerson(Thread th){
th.registerObserver(this);//将当前对象注册到广播中
}
@override
public void update(String name,boolean sex){
this.name = name;
this.sex = sex;
displayElement();
}
@override
public void displayElement(){
System.out.println("name is "+this.name+"sex is"+(sex)?"man":"woman");
}
}
public class Test{
public static void main(String[] args){
Thread th = new Thread();
ObserverPerson p1 = new ObserverPerson(th);
ObserverPerson p2 = new ObserverPerson(th);
ObserverPerson p3 = new ObserverPerson(th);
th.updateThreadProperty("will",true);
th.updateThreadProperty("lucy",false);
}
}
java中其实已经实现了观察者模式,上面代码中的Subject相当于java.util中的observerable类,Observer相当于java.util中的observer接口。