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

    xiaoxiao2025-06-23  7

    观察者模式(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
    最新回复(0)