-
基本骨架:
Subject
abstract class Subject { private List<Observer> observerList = new ArrayList<>(); public void attach(Observer o){observerList.add(o);} public void detach(Observer o){observerList.remove(o);} public void inform(){observerList.forEach(o -> o.update(this));} }
Observer
interface Observer { void update(Subject subject); }
简单模拟实现:
具体事物
class ConstructSubject extends Subject { private String status; public String getStatus(){return status;} public void setStatus(String status){ this.status = status; this.inform(); // 事物发生变化,通知更新 } }
观察者实现
class ConstructObserver implements Observer { String status; @Override public void update(Subject subject) { this.status = ((ConstructSubject)subject).getStatus(); } }
总结:Subject在设计模式中占主动地位,Observer可辅助Subject进行额外功能处理
查看全部 -
Subject : 观察源事物,可添加或删除自身观察者
Observer : 观察者,可接受事物的通知
当事物发生更新变动,则通知观察者做相应处理,另事物状态与观察者状态保持一致
查看全部 -
创建、注册阶段
查看全部 -
客户端操作
查看全部 -
观察者实现的两种模式:
区别:
推模型假定目标知道观察者需要的数据
拉模型不知道目标对象需要什么数据,把自身传递给观察者,由观察者取值
推模型使观察者对象复用性比较差
查看全部 -
使用观察者模式的情况
查看全部 -
适用情况:
查看全部 -
优点: 1,观察者模式实现了观察者和目标之间的抽象耦合; 2,观察者模式实现了动态联动 3,观察者模式支持广播通信 缺点: 可能会引起无谓的操作---->引起误更新
查看全部 -
Observable类的notifyObservers()方法只支持拉的方式,而另一个重载方法notifyObservers(Object content)方法两种方式(推的方式和拉的方式)都支持,所以在第二个时两种都生效
查看全部 -
Java实现与自己实现的对比:
查看全部 -
利用Java提供的观察者模式:
java.util.Observable类和java.util.Observer接口
Java实现与自己实现的对比:
查看全部 -
观察者模型的实现方式:
一、推模型
目标对象主动向观察者推送目标的详细信息,推送的信息通常是目标对象的全部或部分数据
二、拉模型
目标对象在通知观察者的时候,只传递少量信息。
若观察者需要更具体的信息,由观察者主动到目标对象中获取,相当于观察者从目标对象中拉数据。
一般会把目标对象自身通过update方法传递到观察者
比较:
1、推模型是假定目标对象知道观察者需要的数据;拉模型不知道observer需要什么数据,因此把自身传给observer,由观察者来取值
2、推模型使observer对象难以复用,拉模型传递的是目标对象本身,满足各种需要
查看全部 -
认识观察者模式:
1、目标与观察者之间的关系
一对一、一对多、多对一(观察者需要定义多个update方法用于区分)
2、单项依赖
观察者依赖目标,观察者一直在等待目标的通知
3、命名建议
观察者模式又被称为发布订阅模式
①目标接口的定义,名称加Subject后缀
②观察者接口的定义,名称加Observer后缀
③观察者接口的更新方法,名称为update
4、触发通知的时机
先修改状态再通知,否则会导致状态不一致
5、观察者模式的调用顺序示意图
①准备阶段
创建目标对象-》创建观察者对象-》向目标对象注册观察者对象
②运行阶段
改变目标对象的状态-》通知所有注册的观察者对象进行相应的处理-》回调目标对象,获取相应的数据
6、通知的顺序
多个观察者之间是没有先后顺序的
查看全部 -
通用代码:
查看全部 -
观察者模式的设计图
查看全部
举报