1700456678
1700456679
书籍名称:天龙八部 书籍作者:金庸 书籍价格:¥32.00元
1700456680
1700456681
书籍名称:巴黎圣母院 书籍作者:雨果 书籍价格:¥56.00元
1700456682
1700456683
书籍名称:悲惨世界 书籍作者:雨果 书籍价格:¥35.00元
1700456684
1700456685
书籍名称:金瓶梅 书籍作者:兰陵笑笑生 书籍价格:¥43.00元
1700456686
1700456687
书籍名称:Think in Java 书籍作者:Bruce Eckel 书籍价格:¥43.00元
1700456688
1700456689
如果我是负责维护的,我就非常乐意做这样的事情,简单而且不需要与其他的业务进行耦合。我唯一需要做的事情就是在原有的代码上添砖加瓦,然后就可以实现业务的变化。我们来看看这段代码有哪几层含义。
1700456690
1700456691
首先,ComputerBook类必须实现IBook的三个方法,是通过IComputerBook接口传递进来的约束,也就是我们制定的IBook接口对扩展类ComputerBook产生了约束力,正是由于该约束力,BookStore类才不需要进行大量的修改。
1700456692
1700456693
其次,如果原有的程序设计采用的不是接口,而是实现类,那会出现什么问题呢?我们把BookStore类中的私有变量bookList修改一下,如下面的代码所示。
1700456694
1700456695
private final static ArrayList<NovelBook>bookList=new ArrayList<NovelBook>();
1700456696
1700456697
把原有IBook的依赖修改为对NovelBook实现类的依赖,想想看,我们这次的扩展是否还能继续下去呢?一旦这样设计,我们就根本没有办法扩展,需要修改原有的业务逻辑(也就是main方法),这样的扩展基本上就是形同虚设。
1700456698
1700456699
最后,如果我们在IBook上增加一个方法getScope,是否可以呢?答案是不可以,因为原有的实现类NovelBook已经在投产运行中,它不需要该方法,而且接口是与其他模块交流的契约,修改契约就等于让其他模块修改。因此,接口或抽象类一旦定义,就应该立即执行,不能有修改接口的思想,除非是彻底的大返工。
1700456700
1700456701
所以,要实现对扩展开放,首要的前提条件就是抽象约束。
1700456702
1700456703
2.元数据(metadata)控制模块行为
1700456704
1700456705
编程是一个很苦很累的活,那怎么才能减轻我们的压力呢?答案是尽量使用元数据来控制程序的行为,减少重复开发。什么是元数据?用来描述环境和数据的数据,通俗地说就是配置参数,参数可以从文件中获得,也可以从数据库中获得。举个非常简单的例子,login方法中提供了这样的逻辑:先检查IP地址是否在允许访问的列表中,然后再决定是否需要到数据库中验证密码(如果采用SSH架构,则可以通过Struts的拦截器来实现),该行为就是一个典型的元数据控制模块行为的例子,其中达到极致的就是控制反转(Inversion of Control),使用最多的就是Spring容器,在SpringContext配置文件中,基本配置如代码清单6-11所示。
1700456706
1700456707
代码清单6-11 SpringContext的基本配置文件
1700456708
1700456709
<bean id=“father”class=“xxx.xxx.xxx.Father”/>
1700456710
1700456711
<bean id=“xx”class=“xxx.xxx.xxx.xxx”>
1700456712
1700456713
<property name=“biz”ref=“father”></property>
1700456714
1700456715
</bean>
1700456716
1700456717
然后,通过建立一个Father类的子类Son,完成一个新的业务,同时修改SpringContext文件,修改后的文件如代码清单6-12所示。
1700456718
1700456719
代码清单6-12 扩展后的SpringContext配置文件
1700456720
1700456721
<bean id=“son”class=“xxx.xxx.xxx.Son”/>
1700456722
1700456723
<bean id=“xx”class=“xxx.xxx.xxx.xxx”>
1700456724
1700456725
<property name=“biz”ref=“son”></property>
1700456726
1700456727
</bean>
[
上一页 ]
[ :1.700456678e+09 ]
[
下一页 ]