要求:
1.项目中引入logback日志框架;
2.将结果的导入和导出功能,归纳成接口(泛型接口、泛型方法);
3.编写接口实现类的单元测试类(需要引入Junit单元测试框架)。
1.引入日志:
lockback 日志
概述:Logback 是建立于三个主要类之上的:日志记录器(Logger),输出端(Appender)和日志格式化器(Layout)。这三种组件协同工作,使开发者可以按照消息类型和级别来记录消息,还可以在程序运行期间内控制消息的输出格式和输出目的地。
1.日志记录器(Logger):控制要输出哪些日志记录语句,对日志信息级别限制;
2.输出端(Appender):指定了日志将打印到控制台还是文件中;
3.日志格式化器(Layout):控制日志信息的显示格式。
日志输出优先级:
OFF 关闭:最高级别,不输出日志
FATAL 致命:输出非常严重地可能会导致应用程序终止的错误
ERROR 错误:输出错误,但应用还能继续
WARN 警告:输出可能潜在危险状况
INFO 信息:输出应用运行过程中的详细信息
DEBUG 调试:输出更细致的对调试应用有用的信息
TRACE 跟踪:输出更细致的程序运行轨迹
ALL 所有:输出所有级别信息
TRACE < DEBUG < INFO <WARN < ERROR。
在程序中启用Logback记录:
有三个必须步骤:
- 配置 logback 环境;
- 在每个需要执行记录的类里,调用 org.slf4j.LoggerFactory 类的 getLogger() 方法获取一个 Logger 实例,以当前类名或类本身作为参数;
- 调用取得的 logger 实例打印方法,debug(),info() 等,把记录输出到配置里的各 appender。
Logger 在程序中引用:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.junit.Text;
public class BlogAction{
/**
* 引入日志框架 logback 通过 LoggerFactory 获取
*/
private static final Logger LOG = LoggerFactory.getLogger(Test.class);
// private static final Logger LOG = LoggerFactory.getLogger(XXX.class);
// XXX 为使用指定类来初始化日志对象,方便在日志输出时候,可以打印出日志信息所属的类;
public static void main (String[] args){
LOG.info("LOG 成功");
LOG.error("LOG 成功");
}
}
参考:
为什么推荐你使用 logback 取代 log4j
一篇文章带你学会 LOGGERFACTORY.GETLOGGER 的使用
LoggerFactory.getLogger 理解
Logback日志使用详解
logback开发文档
2.将结果的导入和导出功能,归纳成接口(泛型接口、泛型方法)
为啥要创建一个接口那么麻烦呢?这个问题我在学接口这个东西的时候就一直在疑惑,直接写不就好了吗?搞那么麻烦
接口的作用:
- 可以将每个功能独立起来互不影响;
- 保证了安全(实现了软件松耦合1的重要手段),因为接口内只描述了能实现的服务,和提供规范,不涉及实现方法。(这样会比较安全);
- 有拓展性:就是这个接口在之前定义好了一种功能,后面突然发现有更好的功能,或者无法满足要求,但不能放弃之前的,因为还有要使用的地方,这时候接口就很好的解决了这个问题,你只需要在接口处重新定义一下规范和和重写方法就可以,既不会影响其他接口,也很好的实现需要的功能,需要使用时也可以根据规范调用需要的功能实现。
package first.week.project;
/**
* @author 彬彬
*/
public interface ResultOfGameDAO {
// 保存游戏结果
boolean saveJsonData(String jsonString , String jsonFilePath);
// 读取游戏数据
String readJsonData(String jsonString);
}
实现该接口:
ResultOfGameImpl:
package first.week.project;
import java.io.*;
import java.nio.charset.StandardCharsets;
/**
* @author 彬彬
*/
public class ResultOfGameImpl implements ResultOfGameDAO {
private static final ResultOfGameImpl RESULT_OF_GAME = ResultOfGameImpl.getInstance();
public static ResultOfGameImpl getInstance(){
return RESULT_OF_GAME;
/*
将初始化的对象返回回去 // 在使用这个类的时候就创建好了这个对象
*/
}
@Override
public boolean saveJsonData(String jsonString, String jsonFilePath) {
/*
结果 导入 功能
向文件中写入数据
*/
boolean result = false;
BufferedWriter bw = null;
try{
File file = new File(jsonFilePath);
if(!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
file.createNewFile();
}
bw = new BufferedWriter(new OutputStreamWriter((new FileOutputStream(file)), StandardCharsets.UTF_8));
bw.write(jsonString);
result = true;
}catch(IOException e){
System.out.println("保存数据到json文件异常!" + e);
}finally{
if(null != bw){
try{
bw.close();
}catch(IOException exception){
System.out.println("保存数据到json文件后,关闭流异常" + exception);
}
}
}
return result;
}
@Override
public String readJsonData(String jsonFilePath) {
File file = new File(jsonFilePath);
String result = null;
FileReader fr = null;
/*
// 文件读取对象
*/
BufferedReader br = null;
/*
// 字符流对象
*/
try{
fr = new FileReader(file);
br = new BufferedReader(fr);
String str;
while((str = br.readLine()) != null){
result = str;
}
}catch(Exception e) {
e.printStackTrace();
} finally{
try{
fr.close();
br.close();
}catch(Exception e) {
e.printStackTrace();
}
}
return result;
}
}
参考:
Java中接口的意义
Java 接口(interface)的用途和好处
3.单元测试类:
JUnit 是一个 java 编程语言的单元测试框架。JUnit 在测试驱动的开发方面有很重要的发展,是起源于JUnit 的一个统称为 xUnit 的单元测试类框架之一。
引入JUnit单元测试框架:
最终实现源码
RockPaperScissorsV1:
package first.week.project;
//V1.1要求:
// 1.项目中引入logback日志框架;√
// 2.将结果的导入和导出功能,归纳成接口(泛型接口、泛型方法);
// 3.编写接口实现类的单元测试类(需要引入Junit单元测试框架)。
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Scanner;
/**
* @author 彬彬
*/
public class RockPaperScissorsV1 {
/**
* 引入日志框架 logback
*/
private static final Logger LOG = LoggerFactory.getLogger(Test.class);
public static Robot robot = new Robot();
public static Scanner scan = new Scanner(System.in);
public static String Filepath = "C:\\Users\\彬彬\\IdeaProjects\\test\\test_file\\result.txt";
public static void main(String[] args) {
gameV1();
}
public static void gameV1(){
ResultOfGameDAO result = new ResultOfGameImpl();
// 初始化文件
result.saveJsonData("null",Filepath);
int n = 5;
for(int i=0;i<n;i++){
System.out.println("===== 石头剪刀布 =>");
System.out.println("你出:(请输入 剪刀 石头 或 布):");
Person person = new Person(scan.nextLine());
String robotPunch = robot.robotPunch();
System.out.println("机器出:"+robotPunch);
// 这一局的游戏结果
String result1 = gameOfRockPaperScissors(person.getPunch(),robotPunch);
// 上一局结果
System.out.println("上一局游戏结果:"+ result.readJsonData(Filepath));
// 保存结果
System.out.println("保存结果:" + result.saveJsonData(result1, Filepath));
}
}
public static String gameOfRockPaperScissors(String personPunch, String robotPunch) {
if (personPunch.equals(robotPunch)) {
System.out.println("当前局:平局");
return "平局";
}
boolean personPunchRes =
("剪刀".equals(personPunch) && "布".equals(robotPunch) ||
"石头".equals(personPunch) && "剪刀".equals(robotPunch) ||
"布".equals(personPunch) && "石头".equals(robotPunch));
boolean robotPunchRes =
("剪刀".equals(robotPunch) && "布".equals(personPunch) ||
"石头".equals(robotPunch) && "剪刀".equals(personPunch) ||
"布".equals(robotPunch) && "石头".equals(personPunch));
if (personPunchRes) {
System.out.println("当前局:人类胜利");
return "人类胜利";
}
if (robotPunchRes) {
System.out.println("当前局:机器胜利");
return "机器胜利";
}
LOG.error("输入数据异常");
/*
日志输出优先级
OFF 关闭:最高级别,不输出日志
FATAL 致命:输出非常严重地可能会导致应用程序终止的错误
ERROR 错误:输出错误,但应用还能继续
WARN 警告:输出可能潜在危险状况
INFO 信息:输出应用运行过程中的详细信息
DEBUG 调试:输出更细致的对调试应用有用的信息
TRACE 跟踪:输出更细致的程序运行轨迹
ALL 所有:输出所有级别信息
*/
return "输入数据异常";
}
}
ResultOfGameDAO:
package first.week.project;
/**
* @author 彬彬
*/
public interface ResultOfGameDAO {
boolean saveJsonData(String jsonString , String jsonFilePath);
String readJsonData(String jsonString);
}
ResultOfGameImpl:
package first.week.project;
import java.io.*;
import java.nio.charset.StandardCharsets;
/**
* @author 彬彬
*/
public class ResultOfGameImpl implements ResultOfGameDAO {
private static final ResultOfGameImpl RESULT_OF_GAME = ResultOfGameImpl.getInstance();
public static ResultOfGameImpl getInstance(){
return RESULT_OF_GAME;
/*
将初始化的对象返回回去 // 在使用这个类的时候就创建好了这个对象
*/
}
@Override
public boolean saveJsonData(String jsonString, String jsonFilePath) {
/*
结果 导入 功能
向文件中写入数据
*/
boolean result = false;
BufferedWriter bw = null;
try{
File file = new File(jsonFilePath);
if(!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
file.createNewFile();
}
bw = new BufferedWriter(new OutputStreamWriter((new FileOutputStream(file)), StandardCharsets.UTF_8));
bw.write(jsonString);
result = true;
}catch(IOException e){
System.out.println("保存数据到json文件异常!" + e);
}finally{
if(null != bw){
try{
bw.close();
}catch(IOException exception){
System.out.println("保存数据到json文件后,关闭流异常" + exception);
}
}
}
return result;
}
@Override
public String readJsonData(String jsonFilePath) {
File file = new File(jsonFilePath);
String result = null;
FileReader fr = null;
/*
// 文件读取对象
*/
BufferedReader br = null;
/*
// 字符流对象
*/
try{
fr = new FileReader(file);
br = new BufferedReader(fr);
String str;
while((str = br.readLine()) != null){
result = str;
}
}catch(Exception e) {
e.printStackTrace();
} finally{
try{
fr.close();
br.close();
}catch(Exception e) {
e.printStackTrace();
}
}
return result;
}
}
Robot :
package first.week.project;
/**
* @author 彬彬
*/
public class Robot {
private String punch;
public Robot(){
}
public String robotPunch(){
double flag;
flag = (Math.random() * 3 );
switch((int)flag){
case 0:
this.punch = "石头";
return "石头";
case 1:
this.punch = "剪刀";
return "剪刀";
case 2:
this.punch = "布";
return "布";
default: break;
}
return null;
}
public String getPunch() {
return punch;
}
public void setPunch(String punch) {
this.punch = punch;
}
}
Person:
package first.week.project;
/**
* @author 彬彬
*/
public class Person {
private String punch;
public Person(){
}
public Person (String punch){
this.punch = punch;
}
public String getPunch() {
return punch;
}
public void setPunch(String punch) {
this.punch = punch;
}
}
(文章根据个人理解描述,如果有不合理或错误欢迎大佬们指出,如有侵权及时删除)
什么是耦合,紧耦合,松耦合
创建一个归纳接口:
ResultOfGameDAO:(接口) ↩︎