1、JAVA编程规范之开闭原则:对扩展开放,对修改关闭(不建议修改代码)
怎样才算符合JAVA的开闭原则呢?
各司其职:各个类、各个模块都有明确的职责。 封装
弱耦合性:模块间的关联性越弱越好。 接口解耦合 多态
可重用性:可以重复使用相同的模块。 封装 继承
可扩展性:能在原有基础上扩展功能。 继承 多态
2、职责的划分
数据访问层:用来访问数据 数据访问对象DAO
业务处理层:用来处理数据 业务处理对象BIZ/Service
视图层:用来展示数据以及和用户交互 视图对象VIEW
注意:
任何一个项目都至少需要划分成以上三层
3、代码逻辑分析(开闭原则)
A.每一层对应于一个包,假设三个职责层的包分别为“com.csdn.DAO”、“com.csdn.BIZ”、“com.csdn.VIEW”
B.“com.csdn.DAO”包中的元素:
DAO接口:DAO接口有一个String getData()方法(由于数据数据产生可以是直接创建,可以是从文件读取,方式多种多样,包括产生的数据也可以不同。它们对应不同的业务需求,可以由DAO接口不同的实现类实现)。
DAO接口的实现类:不同的业务需求对应不同的实现类。
C.“com.csdn.BIZ”包中的元素:
BIZ接口:BIZ接口有一个String operate()方法和void setDAO(DAO dao)方法(由于数据的处理可能有很多种,转大小写,英译中,中译英等,它们对应不同的业务需求,可以由BIZ接口中不同的实现类实现。处理数据首先要拿到数据,所以要定义一个setDAO(DAO dao)方法,拿到DAO对象。然后在String operate()方法中调用getData()方法拿到数据)。
BIZ接口的实现类:不同的业务需求对应不同的实现类。每个实现类都需要声明个private DAO dao属性。
D.“com.csdn.VIEW”包中的元素:
View类:View类有一个String showData()方法、一个void setBIZ(BIZ biz)方法、一个private BIZ biz属性(由于数据展示只是将其打印输出在控制台即可,不受业务逻辑的影响,所以不需要定义接口。展示数据首先要拿到处理后的数据,所以顶一个void setBIZ(BIZ biz)方法,拿到BIZ对象,然后在String showData()方法调用operate()方法拿到处理后的数据)。
F.“com.csdn.controller”包中的元素:
测试类Test:从ViewFactory类中拿到View对象,再调用showData()方法展示数据即可(View对象的生成由“com.csdn.util”包中的ViewFactory类和ConfigReader类共同完成)。
G."com.csdn.util"包中的元素:
ConfigReader类:ConfigReader类有一个Properties read()方法和一个private Properties ps=new Properties()属性(在read()方法中使用输入流读取配置文件中的信息,然后ps.load(输入流)将配置信息加载成键值对,然后返回ps对象)。
注:Properties类中有一个load()方法,传入一个输入流,可以将输入流读取的文件内容“DAO=com.bjsxt.DAO.WelcomeDao”按等号拆分转成key-value键值对保存在Properties对象中,再通过Properties类的getProperty(String key)方法,可以得到value(这儿的value为DAO的实现类Welcome的完全限定名)。
ViewFactory类:ViewFactory类有一个View createView()方法和一个private ConfigReader cr=new ConfigReader()属性(在createView()方法中Properties ps=cr.read();拿到Properties对象,通过该对象调用getProperty(String name)拿到类的完全限定名,然后通过完全限定名创建DAO、BIZ、View对象,再将View对象返回给Test类即可。需要使用BIZ对象调用setDAO(DAO dao)方法,使用View对象调用setBIZ(BIZ biz)方法)。
4、异常处理优化
DAO的实现类的getData()方法抛出异常,使用try…catch捕获,catch块中throw new RuntimeException(e.getMessage())将该异常信息抛出。
BIZ实现类的operate()方法调用了getData()方法,由于getData()方法抛出异常,所以这儿要进行处理。使用try…catch捕获,catch块中throw new RuntimeException(e.getMessage())将该异常信息抛出。
View类的showData()调用了operate()方法,由于operate()抛出了异常,所以这儿要进行处理。使用try…catch捕获,catch块中System.err.println(e.getMessage())将该异常信息输出。