JAVA 剪刀石头布简单实现 V1.1

要求:

    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记录:
有三个必须步骤:

  1. 配置 logback 环境;
  2. 在每个需要执行记录的类里,调用 org.slf4j.LoggerFactory 类的 getLogger() 方法获取一个 Logger 实例,以当前类名或类本身作为参数;
  3. 调用取得的 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. 可以将每个功能独立起来互不影响;
  2. 保证了安全(实现了软件松耦合1的重要手段),因为接口内只描述了能实现的服务,和提供规范,不涉及实现方法。(这样会比较安全);
  3. 有拓展性:就是这个接口在之前定义好了一种功能,后面突然发现有更好的功能,或者无法满足要求,但不能放弃之前的,因为还有要使用的地方,这时候接口就很好的解决了这个问题,你只需要在接口处重新定义一下规范和和重写方法就可以,既不会影响其他接口,也很好的实现需要的功能,需要使用时也可以根据规范调用需要的功能实现。
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单元测试框架:

参考:使用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;
    }
}

(文章根据个人理解描述,如果有不合理或错误欢迎大佬们指出,如有侵权及时删除)


  1. 什么是耦合,紧耦合,松耦合
    创建一个归纳接口:
    ResultOfGameDAO:(接口) ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值