使用MVC编程思想实现HelloWorld功能

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"

使用MVC编程思想实现HelloWorld功能_第1张图片

HelloWorld文本文件

使用MVC编程思想实现HelloWorld功能_第2张图片

 

运行效果图

使用MVC编程思想实现HelloWorld功能_第3张图片

 

你可能感兴趣的:(Java,java从入门到精通)