观察者模式
在Java的设计模式中有一种叫做观察者模式。观察者,顾名思义,就是观察某事某物的变化并作出反应。
在程序中也可以使用观察者,首先定义一个观察者接口:
public interface Observer {
//其中只定义了一个更新的方法,可以不用参数。
public void update(int i);
}
定义了观察者,还需要定义观察者所观察的内容:
import java.util.ArrayList;
public abstract class Subject{
ArrayList<Observer> list;
public Subject(){
init();
}
public void init(){
list = new ArrayList<Observer>();
}
public void attach(Observer observer){
if(observer!=null)list.add(observer);
}
public void Detach(Observer observer){
if(observer!=null)list.remove(observer);
}
//可以保留空白留待具体的主题来进行操作
public void notifyData(){
Observer observer;
//通知所有的观察者
for(int i = 0 ; i < list.size() ; i++){
observer = list.get(i);
observer.update(i);
}
}
}
使用观察者的接口可以构建出具体的观察者,并完成相应的功能:
public class ConcreteObserver implements Observer{
private String name;
public ConcreteObserver(){
name = "";
}
public ConcreteObserver(String name){
if(name!=null)this.name = name;
else name = "";
}
//继承的方法
public void update(int i){
System.out.println(name + " has been notify");
}
}
定义具体的观察内容、主题:
public class ConcreteSubject extends Subject{
public ConcreteSubject(){
super();
}
//在具体的主题中通知所有的观察者
public void notifyData(){
Observer observer;
for(int i = list.size() ; i > 0 ; i--){
observer = list.get(i-1);
observer.update(i);
}
}
}
以上部分就是观察者的内容,只需在主题中添加观察者,运行程序时如果主题有更新,那么所有的观察者都会获得更新。
为什么要使用观察者呢?
使用观察者有利于类的解耦,在建立视图时,视图是常常有更新的,如果每次更新都要一个个的通知与视图有关的类或对象,在程序的执行过程中是不方便的,也不利于程序员对程序的调试维护。
使用观察者时,所有的更新逻辑都使用专门的类来维护,对程序的维护更为简单。