一:观察者模式作用
观察者模式是一种设计模式,用来解决系统间通信的一种机制。作为系统,必然有以下的场景:
1:上层(用户层)进行一些操作,导致相关变量或者属性发生了改变,而系统中相关配置或者相关场景依赖该属性,因此需要将该变量变化的消息通知系统各个相关场景负责区进行相应的配置。
2:下层(底层)也可以理解为和系统的交互层发生变化,需要将该属性的变化通知到上层,提示用户相应的消息。
总体而言,基于此俩种场景需要使用观察者模式,解决1对多或者1对1 的情景下,将系统不同场景下的属性变化通知到相关负责类对象。
二:观察者模式相关类
本人将观察者模式分为三大类:
1:Subject(主题):也叫被观察者,这个也就是会发生变化的属性,也就是系统或者用户操作产生的结果
2:Observer(观察者):这个是观察者,主要作用是在Subject发生变化之后进行相应的操作来维持系统的稳定
3:Context(上下文):这个主要是在被观察者变化之后发出通知,因为观察者在进程中某处会被注册给Subject,而Sunbect发生变化之后需要通知Observer也需要一定的上下文场景。
在系统中发现一处使用观察者模式时首先找到Context,才能进一步确认Subject和Observer,最后确认调用关系。在系统中,其实就是运行的一条条进程和进程中的线程,观察者模式适用在同一进程间,可能会通过不同的线程来分发消息。
三:相关代码演示
3.1创建Subject类
图1:主要属性 图2:添加观察者 图3 更新观察者 图 4 :相关属性发生变化3.2 创建Observer父类
图5:更新属性方法3.3 创建Observer子类
图6 子类1 图7:子类23.4 创建Context类
图8:简单模拟整个业务流程四:相关代码解释
根据开篇介绍的观察者模式的作用和观察者的三大类,来通过模拟业务介绍整个代码的流程:
4.1 1对多关系的确认
首先系统中存在一个1对多的属性
图9:相关属性这个属性在本Demo中为了简单放在了Subject类当中,但是实际系统中定然不在此处
这个属性如果发生变化,系统有2个地方需要更新,即MyFirstObserver和MySecondObserver需要更新此为1对多
4.2 :Subject确认
存在1对多关系且有通信的需要,于是就有了建立Subject 的必要。建立Subject就必须存在几个方法:
addObserver(Observer o);
updateObserver();
setRelativeModle(int
relativemodle);
因为属性发生改变,因此通过updateObserver通知所有关心该属性的类,关心该属性的类通过addObserver已经注册到Subject 的
List myRegisty = newArrayList<>();
属性当中
4.3 Context 贯彻业务流程
有了上面1对多的通信需要,也准备了Subject和Observer,那么在系统进程正在启动的某一时刻,系统一定先创建了观察者,如
//创建观察者
MyFirstObserver mFirstObserver = new MyFirstObserver();
MySecondObserver mSecondObserver = newMySecondObserver();
和Subject
//创建主题
Subject subject = new Subject();
以及在创建完他们,就将Observer和Subject连在一起,如
//将观察者注册到Subject
subject.addObserver(mFirstObserver);
subject.addObserver(mSecondObserver);
到最后一步,系统由于上层的操作或者下层的系统将交互导致属性值relativeModle发生变化时,Subject便去通知所有的观察者去更新,而所有的观察者在进行完update操作时即是接收到系统属性变化的标志。
网友评论