赞
踩
1、观察者模式
观察者模式 ( Observer Pattern )是一种行为型模式。 常用于对象间存在一对多关系时,比如,当一个对象被修改时,需要自动通知它的依赖对象。
2、实现思路
(1)、定义被观察者的行为(包含业务数据,观察者列表,添加观察者的方法,通知观察者的方法等)。定义规范后,在编写实现类。本例直接编写了实现类。
(2)、编写观察者的行为和实现类。(行为:将自身添加到主题的属性中,复写接收数据的方法)
1、示例场景
多个观察者观察一个主题,主题发生改变时,促发各个观察者自身的业务方法。
2、代码示例
// 1、定义主题(被观察者) import lombok.Data; import java.util.ArrayList; import java.util.List; @Data public class Subject { private String data; List<Observer> observerList; // 观察者列表 public Subject() { observerList = new ArrayList<>(); } public void setData(String data) { // 发布消息,通知所有观察者 this.data = data; System.out.println("发布了消息:"+this.data); notifyAllObser(); } public void addObserver(Observer observer) { // 添加观察者 observerList.add(observer); } public void notifyAllObser() { // 通知观察者 for (Observer observer : observerList) { observer.getSubData(); } } } // 2、定义观察者规范 public abstract class Observer { public Subject subject; public abstract void getSubData(); } // 3.1、编写观察者实现类,记者类 public class Reporter extends Observer { public Reporter(Subject subject) { this.subject = subject; this.subject.addObserver(this); } @Override public void getSubData() { System.out.println("记者观察到消息:" + subject.getData()); } } // 3.2、编写观察者实现类,厨师类 public class Cooker extends Observer { public Cooker(Subject subject) { this.subject = subject; this.subject.addObserver(this); } @Override public void getSubData() { System.out.println("厨师观察到消息:" + subject.getData()); } } // 4、测试 public static void main(String[] args) { Subject subject = new Subject(); Observer observer1 = new Reporter(subject); Observer observer2 = new Cooker(subject); subject.setData("1111"); System.out.println("************"); subject.setData("2222"); }
由上图可看到,当主题发布消息后,该主题对象的观察者集合中的每一个人都可以接收到消息。
总结:
观察者模式往往用于一对多的场景,主要套路为你中有我,我中有你。所以代码上要把观察者内置到被观察者的属性中(列表),被观察者也要内置到观察者中,彼此定义了对方的属性,之后封装数据可以是构造方法实现,也可以是自定义方法等。形成这种关系后,当被观察者发生改变时,就可以把被观察者的业务消息通知到内置的观察者列表中,通常是直接调用观察者的方法实现。
学海无涯苦作舟!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。