最新《深入浅出Netty源码剖析》

时间:2019-02-19
本文章向大家介绍最新《深入浅出Netty源码剖析》,主要包括最新《深入浅出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 
版权声明:本文为博主原创文章,转载请附上博文链接!