最新《深入浅出Netty源码剖析》
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、具体代码
“com.csdn.DAO”包:
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());
}
}
}
“com.csdn.BIZ”包
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;
}
}
“com.csdn.VIEW”包
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;
}
}
"com.csdn.util"包
读配置文件的类
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;
}
}
}
“com.csdn.controller”包
测试类
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());
}
}
配置文件 (配置文件不一定要.txt结尾,也可以.ini等)
"C:\\Users\\利荣\\Desktop\\a.txt"
HelloWorld文本文件
运行效果图
---------------------
作者:Mr_249
来源:CSDN
原文:https://blog.csdn.net/pengzonglu7292/article/details/86498501
版权声明:本文为博主原创文章,转载请附上博文链接!
- Elasticsearch聚合 之 Terms
- Elasticsearch聚合初探——metric篇
- AngularJS API之$injector ---- 依赖注入
- AngularJS API之extend扩展对象
- AngularJS API之equal比较对象
- Elasticsearch之_default_—— 为索引添加默认映射
- Elasticsearch 动态映射——自动检测
- Elaticsearch REST API常用技巧
- C++拷贝构造函数
- 记录安装oracle的那些事(一)之oracle我很大
- Elasticsearch 连接查询
- 小程序加戏成功!变身游戏成新版微信最大主角,用户玩得不亦乐乎
- 堆实例
- 大数加法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 聊一聊微信小程序包内容
- 全面分析 MySQL并发控制
- Flink History Server
- 几种定时任务(Timer、TimerTask、ScheduledFuture)的退出—结合真实案例【JAVA并发】
- gitlab内存消耗大,频繁出现502错误的解决办法
- Java基于POI实现excel任意多级联动下拉列表——支持从数据库查询出多级数据后直接生成【附源码】
- Elasticsearch 通过Scroll遍历索引,构造pandas dataframe 【Python多进程实现】
- 【Java】 NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException、ArrayIndexOutOfBoundsE
- Meow攻击删除不安全(开放的)的Elasticsearch(及MongoDB) 索引,建一堆以Meow结尾的奇奇怪怪的索引(如:m3egspncll-meow)
- MySQL LOAD DATA INFILE—从文件(csv、txt)批量导入数据
- MySQL 快速删除大量数据(千万级别)的几种实践方案——附源码
- 什么样的代码是好代码?
- Elastic search集群新增节点(同一集群,同一物理机)
- Tesseract-OCR 4.1.0 安装和使用— windows及CentOS
- Java 大小端转换(基于ByteBuffer)