设计模式GOF23——观察者模式
2016-08-15 06:04
330 查看
观察者模式(Observer),是一种行为性模型,行为型模式关注的是系统中对象之间的相互交互,解决系统在运行时对象之间的相互通信和协作,进一步明确对象的职责。相比来说,创建型模式关注对象的创建过程,结构型模式关注对象和类的组合关系。
实现有两种方式:
推:每次都会把通知以广播的方式发送给所有观察者,所有的观察者只能被动接收。
拉:观察者只要知道有情况即可,至于什么时候获取内容,获取什么内容,都可以自主决定。
输出结果是
100
100
****为了区分开
200
200
这个时候就不用创建Observer的抽象了,直接使用Java包中是就可以了。目标对象已经修改使用setChanged()方法,通知所有的观察者用notifyObservers(变量值)方法,实现Observer还需要实现update(Observerable o,Objsct g)方法,其中Object g可以接收任何需要观察的对象。
4000
模式的职责
观察者模式主要用于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
相关文章推荐
- 【GOF23设计模式】观察者模式
- GOF23设计模式之观察者模式之理解
- 【GOF23设计模式】_观察者模式_广播机制_消息订阅_网络游戏对战原理_自带类与接口JAVA251-252
- 【GOF23设计模式】_观察者模式
- GOF 23 设计模式之 观察者模式(Observer)
- Gof 23设计模式
- 设计模式之路--Gof23分类
- GOF23设计模式之组合模式之实现
- 笔记--设计模式精解c++-GoF 23 种设计模式解析
- 设计模式GOF23之单例模式实现
- 设计模式GOF23之单例模式效率测试与反射和反序列化问题的解决
- 【转载】 笔记--设计模式精解c++-GoF 23 种设计模式解析
- GOF23设计模式汇总
- GOF23设计模式之原型模式之实现
- 笔记--设计模式精解c++-GoF 23 种设计模式解析
- <转载> 设计模式精解c++-GoF 23 种设计模式解析
- 23个GOF23设计模式的定义
- 设计模式 23 观察者模式
- GOF23设计模式之动态代理模式实现之经典
- GOF23设计模式之静态代理模式实现之经典