当对象间存在一对多关系时,使用观察者模式。
比如,当一个对象被修改时,则会自动通知它的依赖对象。
观察者模式属于行为型模式。
通知观察者的方式:推(观察者被动接受)与 拉(观察者接到通知,可自由选择查看)
观察者模式模拟游戏内玩家参数同步:
首先定义一个观察者的接口:
/*观察者*/
public interface Observer {
void update(Subject s);
}
然后定义一个参数对象类:
这个对象可以由无数个观察者观察
public class Subject {
protected List<Observer > list=new ArrayList<>();//定义一个容器存储所有的观察者
public void registerObserver(Observer obs){
list.add(obs);
}
public void removeObserver(Observer obs){
list.remove(obs);
}
public void notifyAllObservers(){//通知所有观察者,接收对象更新
for(Observer obj:list){
obj.update(this);
}
}
}
定义一个具体参数继承参数对象类:
/*具体的某一个主题对象*/
public class ConcreteSubject extends Subject {
private int state;//该对象的状态值
public int getState(){
return state;
}
public void setState(int state) {
this.state = state;
this.notifyAllObservers();
}
}
定义具体的观察者类:
public class ObjserverA implements Observer {
private int mystate;//当前观察者的状态,需要与目标对象状态一致
@Override
public void update(Subject s) {
mystate=((ConcreteSubject)s).getState();//将目标对象的状态值给当前观察者
}
public int getMystate(){
return mystate;
}
public void setMystate(int mystate) {
this.mystate = mystate;
}
}
客户端实现:
public class client {
public static void main(String[] args) {
ConcreteSubject subject=new ConcreteSubject();//创建一个目标对象
ObjserverA obs1=new ObjserverA();//创建三个观察者对象
ObjserverA obs2=new ObjserverA();
ObjserverA obs3=new ObjserverA();
subject.registerObserver(obs1);//建立三个观察者(游戏玩家)观察对象subject
subject.registerObserver(obs2);
subject.registerObserver(obs3);
subject.setState(520);//将该对象状态改为520
System.out.println(obs1.getMystate());
}
JavaSE提供了一个Observable类以及Observer接口 :
参数对象继承Observable类,而观察者们继承Observer接口来实现观察者模式,里面有自定义的设定参数,通知等方法