西门子6es7972-0bb52-0xa0 西门子6es7972-0bb52-0xa0
西门子6es7972-0bb52-0xa0 西门子6es7972-0bb52-0xa0
西门子6es7972-0bb52-0xa0 西门子6es7972-0bb52-0xa0
西门子6es7972-0bb52-0xa0 西门子6es7972-0bb52-0xa0
西门子6es7972-0bb52-0xa0 西门子6es7972-0bb52-0xa0
西门子6es7972-0bb52-0xa0 西门子6es7972-0bb52-0xa0
西门子6es7972-0bb52-0xa0 西门子6es7972-0bb52-0xa0
西门子6es7972-0bb52-0xa0 西门子6es7972-0bb52-0xa0
设计上的缺陷,当出现这种情况时,应当将父类再次拆分成2个子类,保证任何一个父类的行为和特征均是该继承体系中共有的!
好好学java
问:随着需求的变化,父类中需要增加共有行为时怎么办?这就破坏了“开放封闭原则”。
这并未破坏“开放封闭原则”!在系统迭代更新的过程中,修改原有的代码是在所难免的,这并不违背“开放封闭原则”。
“开放封闭原则”要求我们:当系统在迭代过程中,次出现某一类型的需求时,是允许修改的;在此时,应该对系统进行修改,并进行合理地设计,以保证对该类型需求的再次修改具备可扩展性。当再一次出现该类型的需求时,就不应该修改原有代码,只允
观察者模式是什么
如果出现如下场景需求时,就需要使用观察者模式。
如果存在一系列类,他们都需要向指定类获取指定的数据,当获取到数据后需要触发相应的业务逻辑。这种场景就可以用观察者模式来实现。
在观察者模式中,存在两种角色,分别是:观察者和被观察者。被观察者即为数据提供者。他们呈多对一的关系。
类图描述好好学java
被观察者是数据提供方,观察者是数据获取方
一个普通的类,如果要成为观察者,获取指定的数据,一共需要如下几步:
首先,需要实现observer接口,并实现update函数;
然后,在该函数中定义获取数据后的业务逻辑;
update(observable, object)一共有两个参数:
observable:被观察者对象(数据提供方)
object:数据本身
后,通过调用 被观察者 的addobservable()或者通过spring的xml配置文件完成观察者向被观察者的注入。此时,该观察者对象就会被添加进 被观察者 的list中。
调用者才是真正的数据提供方。当调用者需要广播数据时,只需调用 被观察者 的notidyobservers()函数,该函数会遍历list集合,并依次调用每个observer的update函数,从而完成数据的发送,并触发每个observer收到数据后的业务逻辑。
两种注册观察者的方式
将observer注册进observable中有如下两种方式:
1. 运行前,通过spring xml
在系统运行前,如果观察者数量可以确定,并在运行过程中不会发生变化,那么就可以在xml中完成list对象的注入,这种方式代码将会比较简洁。
1、配置好所有 观察者 bean
<!-- 创建observera --> <bean name="observera" class="observsera"> </bean> <!-- 创建observerb--> <bean name="observerb" class="observserb"> </bean>
2、 配置好 被观察者 bean,并将所有观察者bean注入给被观察者bean
<!-- 创建observable --> <bean name="observable" class="observable"> <property name="observerlist"> <list> <ref bean="observera" /> <ref bean="observerb" /> </list> </property> </bean> 2. 运行中,通过addobserver()函数
在spring初始化的时候,通过addobserver()函数将所有observer对象注入observable的observerlist中。
@component public class initconfiguration implements applicationlistener<contextrefreshedevent>{ @override public void onapplicationevent(contextrefreshedevent arg0) { if(event.getapplicationcontext().getparent() == null){ observable observable = (observable)event.getapplicationcontext().getbean("observable