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())将该异常信息输出。
5、具体代码
DAO接口:
package com.csdn.DAO;
public interface DAO {
String getData();
}
DAO接口实现类:
package com.csdn.DAO;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class HelloWorldDao implements DAO {
/*
* 从文件中读取再输出
*
* @see com.bjsxt.DAO.DAO#getData()
*/
@Override
public String getData() {
try {
InputStream is = new FileInputStream(new File("C:\\Users\\利荣\\Desktop\\b.txt"));
byte[] arr = new byte[1024];
int len = 0;
String str = null;
while ((len = is.read(arr)) != -1) {
str = new String(arr, 0, len);
}
return str;
} catch (IOException e) {
throw new RuntimeException(e.getMessage());
}
}
}
BIZ接口
package com.csdn.BIZ;
import com.csdn.DAO.DAO;
public interface BIZ {
String operate();
void setDAO(DAO dao);
}
BIZ接口实现类
package com.csdn.BIZ;
import com.csdn.DAO.DAO;
public class HelloWorldBiz implements BIZ{
private DAO dao;
@Override
public String operate() {
try {
return this.dao.getData();
}catch(Exception e) {
throw new RuntimeException(e.getMessage());
}
}
@Override
public void setDAO(DAO dao) {
this.dao=dao;
}
}
View类
package com.csdn.VIEW;
import com.csdn.BIZ.BIZ;
public class View {
private BIZ biz;
public String showData() {
try {
return biz.operate();
}catch(Exception e) {
System.err.println(e.getMessage());
return null;
}
}
public void setBIZ(BIZ biz) {
this.biz=biz;
}
}
读配置文件的类
package com.csdn.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class ConfigReader {
private Properties ps = new Properties();
public Properties read() {
InputStream is = null;
try {
is = new FileInputStream(new File("C:\\Users\\利荣\\Desktop\\a.txt"));
ps.load(is);
} catch (IOException e) {
e.printStackTrace();
}
return ps;
}
}
创建对象的类
package com.csdn.util;
import java.util.Properties;
import com.csdn.BIZ.BIZ;
import com.csdn.DAO.DAO;
import com.csdn.VIEW.View;
public class ViewFactory {
private ConfigReader cr=new ConfigReader();
public View createView() {
Properties ps=cr.read();
String daoName=ps.getProperty("DAO");
String bizName=ps.getProperty("BIZ");
String viewName=ps.getProperty("VIEW");
try {
DAO dao=(DAO) Class.forName(daoName).newInstance();
BIZ biz=(BIZ)Class.forName(bizName).newInstance();
View view=(View)Class.forName(viewName).newInstance();
biz.setDAO(dao);
view.setBIZ(biz);
return view;
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
e.printStackTrace();
return null;
}
}
}
测试类
package com.csdn.test;
import com.csdn.VIEW.View;
import com.csdn.util.ViewFactory;
public class Test {
public static void main(String[] args) {
ViewFactory vf=new ViewFactory();
View view=vf.createView();
System.out.println(view.showData());
}
}
"C:\\Users\\利荣\\Desktop\\a.txt"