观察者模式(Observer),是一种行为性模型,行为型模式关注的是系统中对象之间的相互交互,解决系统在运行时对象之间的相互通信和协作,进一步明确对象的职责。相比来说,创建型模式关注对象的创建过程,结构型模式关注对象和类的组合关系。
模式的职责
观察者模式主要用于1对N的通知。当一个对象的状态变化时,他需要及时告知一系列对象,令他们做出相应。 实现有两种方式: 推:每次都会把通知以广播的方式发送给所有观察者,所有的观察者只能被动接收。 拉:观察者只要知道有情况即可,至于什么时候获取内容,获取什么内容,都可以自主决定。
模式的实现
public interface Observer {
void uppdate(Subject s);
}
class PushObserver implements Observer{
private int x;
public void uppdate(Subject s) {
this.x = ((RealSubject)s).getX();
}
public int getX() {
return this.x;
}
}
class PopObserver implements Observer{
private int x =
0;
private Subject s =
null;
public void uppdate(Subject s) {
this.s = s;
}
public int getX(){
if(
null != s){
this.x = ((RealSubject)s).getX();
}
return x;
}
}
public class Subject {
List<Observer>list =
new ArrayList<Observer>();
public void registerObserver(Observer observer){
list.add(observer);
}
public void removeObserver(Observer observer){
list.remove(observer);
}
public void notifyAllObserver(){
for(Observer o:list){
o.uppdate(
this);
}
}
}
class RealSubject extends Subject{
private int x;
public int getX() {
return x;
}
public void setX(
int x) {
this.x = x;
this.notifyAllObserver();
}
}
public class Client {
public static void main(String[] args) {
RealSubject rs =
new RealSubject();
PushObserver po =
new PushObserver();
PopObserver oo =
new PopObserver();
rs.registerObserver(oo);
rs.registerObserver(po);
rs.setX(
100);
System.out.println(po.getX());
System.out.println(oo.getX());
System.out.println(
"**********为了区分开");
rs.setX(
200);
System.out.println(po.getX());
System.out.println(oo.getX());
}
}
输出结果是 100 100 ****为了区分开 200 200
JAVASE中提供的类包装
java.util.Observable和java.util.Observer来实现观察者模式 这个时候就不用创建Observer的抽象了,直接使用Java包中是就可以了。目标对象已经修改使用setChanged()方法,通知所有的观察者用notifyObservers(变量值)方法,实现Observer还需要实现update(Observerable o,Objsct g)方法,其中Object g可以接收任何需要观察的对象。
模式的应用
在很多软件中都有一些需要共享的东西,比如游戏时每个玩家的操作,聊天时聊天的信息等等,这个时候就可以使用观察者模式。
转载请注明原文地址: https://ju.6miu.com/read-1300242.html