您的位置:首页 > 编程语言 > Go语言

设计模式GOF23——观察者模式

2016-08-15 06:04 330 查看
观察者模式(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可以接收任何需要观察的对象。

模式的应用

在很多软件中都有一些需要共享的东西,比如游戏时每个玩家的操作,聊天时聊天的信息等等,这个时候就可以使用观察者模式。

4000
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式 对象 通信