1700456663
System.out.println(“书籍名称:”+book.getName()+”\t书籍作者:
1700456664
1700456665
“+book.getAuthor()+”\t书籍价格:”+formatter.format
1700456666
1700456667
(book.getPrice()/100.0)+“元”);
1700456668
1700456669
}
1700456670
1700456671
}
1700456672
1700456673
}
1700456674
1700456675
书店开始销售计算机书籍,运行结果如下所示。
1700456676
1700456677
––––书店买出去的书籍记录如下:–––––––
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
[
上一页 ]
[ :1.700456663e+09 ]
[
下一页 ]