美文网首页开发Java小白翻身
Java小白翻身 - Java接口教程,适合新人,通俗易懂1

Java小白翻身 - Java接口教程,适合新人,通俗易懂1

作者: 剽悍一小兔 | 来源:发表于2021-07-18 13:31 被阅读0次

    可能是老板看我太辛苦,就新招聘了一个员工 -- 小A。我,小白,作为老员工,肯定要好好带带他。我真的很担心小A的代码不规范,咋办呢?

    步骤 1 用接口来规范代码

    我把我的想法跟老板说了,老板也很赞同我的想法。因为我属于老员工了,老板也比较信任我。

    "小白啊,小A刚来,你要多带带他。这个项目是你一手做起来的,这一点上我很赞同你的想法。你可以做接口设计,然后把具体的实现交给小A去做。"

    "接口啊,大学里面好像有教过。"

    "是啊,接口是一种特殊的类,里面只有方法的声明而没有方法的实现。不过最新的jdk也允许写方法体了。"

    "嗯嗯,我知道的,可是上学那会我就特别不理解接口到底有啥用,不写方法实现,就是一个空壳子哇!"

    "嗯,接口的作用还是很大的,这一点你以后会慢慢明白的。小A刚来,代码不规范,逻辑思维还不完善,所以你作为老员工,就需要用接口来规范代码。"

    "哦。。。"我似懂非懂地点了点头。

    接着,老板又仔细给我讲解了接口的用法,我这才茅塞顿开。原来,用接口能做这么优雅的事情,看来我在学校学的,还有自己理解的,都还只是皮毛啊,与实际工作脱节了。

    步骤 2 创建客户服务接口

    先不说接口到底啥概念了,先来看看怎么用接口。现在的菜单是这样子的:

    image

    控制台输入1,则登录客户信息。这个登录信息的代码,目前全部写在Application.java里面了,这样会带来一个问题,就是程序不好维护。随着业务逻辑越来越复杂,Application.java 就会越来越难懂。所以,要把这部分业务拆分出去。

    老板的意思是,我来制定接口,然后让新来的小A来实现,这样的话,项目的大概思路就不至于滑坡。

    创建一个service包,然后创建ICustomerService接口,看下面的步骤图。

    image image

    注意,下面的Kind是Interface。

    image

    步骤 3 ICustomerService.java

    package service;
    
    import entity.Customer;
    import java.util.List;
    
    /**
     * 客户服务接口
     * author 小白
     */
    public interface ICustomerService {
    
        //加载文本的客户资料
        public abstract List<String> loadCustomerFormTxt(String path);
    
        //填充属性到客户对象
        //public 和 abstract可以省略
        Customer fillCustomer(List<String> props);
    
        /**
         * 保存客户对象到Excel
         * @param cst 客户对象
         * @param excelPath Excel的路径
         * @return
         */
        boolean saveToExcel(Customer cst,String excelPath);
    
    }
    

    接口的定义和类非常像,区别是:

    1.接口用的关键字是interface,而不是class

    2.接口里面的方法只有声明,没有方法体,这种方法也叫做抽象方法(用abstract关键字修饰)

    3.接口里面的方法默认都是public

    步骤 4 修改Application.java,引入服务接口

    image

    因为暂时没有接口的实现类(方法都是空的),所以这边只是引用,不去new。

    步骤 5 修改main方法

    先把原来的保存代码注释掉,然后依次调用接口的方法,顺便说一句,<preconsolas';font-size:10.5pt;" style="box-sizing: border-box; font-size: 15px; font-family: Helvetica;">cstList做成static的,方便调用。</preconsolas';font-size:10.5pt;">

    static TuziLinkedList cstList = new TuziLinkedList();
    

    main方法源码:

    public static void main(String[] args){
    
            newLine("******欢迎使用兔子餐厅会员系统******");
            newLine("[1]客户登记入库");
            newLine("[9]退出程序");
    
            //创建一个控制台输入对象,反正就这么写,目前不用去深究含义
            Scanner scanner = new Scanner(System.in);
            //获取用户的输入,程序会挂起等待
            int input = scanner.nextInt();
    
            //直接退出程序
            if(input == 9){
                newLine("程序退出,谢谢使用!");
                return;
            }
    
            //自动读取D盘的customer.txt文件,保存入库
            if(input == 1){
    //          List<String> lines = FileUtil.readLines(new File("D:/customer.txt"), "GBK");
                Application app = new Application();
                //1、读取文本,获取客户资料
                List<String> props = app.customerService.loadCustomerFormTxt("D:/customer.txt");
                //2、解析客户资料到客户对象
                Customer customer = app.customerService.fillCustomer(props);
                //3、直接将客户对象保存到Excel中(暂时先不做批量入库了)
                boolean isSuccess = app.customerService.saveToExcel(customer,"D:/customer.xls");
    
                if(!isSuccess){
                    System.out.println("保存失败,系统出现异常!");
                }else{
                    //4、将这个对象存入链表,备用
                    cstList.add(customer);
                }
    
    //          //先创建一个客户对象,就是setFieldValue方法的第一个参数(给谁的属性赋值)
    //          Customer cst = new Customer();
    //
    //          for (String line : lines) {
    //              //System.out.println(line);
    //              //用字符串的split方法,根据=分割成数组,比如name=张大胖,就会变成['name','张大胖']
    //              String[] split = line.split("=");
    //              String key = split[0]; //获取数组的第一个元素
    //              String value = split[1]; //获取数组的第二个元素
    //              //System.out.println(key + "," + value);
    //              ReflectUtil.setFieldValue(cst,key,value);
    //          }
    //
    //          //打印顾客对象,就是调用他的toString方法
    //          System.out.println(cst);
    //          System.out.println(cst.getName() + "保存完毕!");
            }
    
           //运行完毕后,继续执行main方法,这样程序就不会关闭
           Application.main(null);
    
       }
    

    代码瞬间清晰了,这就是接口的魅力啊!我只需要负责设计出方法的名字,参数和返回值就可以了,剩下的,我去交给别人做。当然,现在这个程序是不能运行的,因为customerService没有赋值,还是null。

    步骤 6 小A啊,这个接口你帮忙实现一下了哇!

    “小A啊,这个接口你帮忙实现一下了哇!”,虽然有点不好意思,但我毕竟是老员工。而且很多业务逻辑已经在main方法里面写了,小A可以去照搬我之前的代码。不过,我也怕小A在别的地方胡乱创建class,所以把实现类也建好了。

    image image image image image
    package service.impl;
    
    import entity.Customer;
    import service.ICustomerService;
    
    import java.util.List;
    
    public class CustomerServiceImpl implements ICustomerService{
    
        @Override
        public List<String> loadCustomerFormTxt(String path) {
            return null;
        }
    
        @Override
        public Customer fillCustomer(List<String> props) {
            return null;
        }
    
        @Override
        public boolean saveToExcel(Customer cst, String excelPath) {
            return false;
        }
    }
    

    步骤 7 接口的实现类必须重写所有抽象方法

    接口的实现类必须重写所有抽象方法,CustomerServiceImpl既然实现了ICustomerService,就必须重写所有的抽象方法,这是一种约定。既然你打算遵循我设计的接口,就必须实现我要求的所有方法。

    步骤 8 loadCustomerFormTxt

    @Override
    public List<String> loadCustomerFormTxt(String path) {
        return  FileUtil.readLines(new File(path), "GBK");
    }
    

    小A基本照搬了我的代码。

    步骤 9 fillCustomer

    @Override
    public Customer fillCustomer(List<String> props) {
        //先创建一个客户对象,就是setFieldValue方法的第一个参数(给谁的属性赋值)
        Customer cst = new Customer();
    
        for (String line : props) {
            //用字符串的split方法,根据=分割成数组,比如name=张大胖,就会变成['name','张大胖']
            String[] split = line.split("=");
            String key = split[0]; //获取数组的第一个元素
            String value = split[1]; //获取数组的第二个元素
            ReflectUtil.setFieldValue(cst,key,value);
        }
    
        return cst;
    }
    

    还是照搬。

    步骤 10 saveToExcel

    @Override
    public boolean saveToExcel(Customer cst, String excelPath) {
        System.out.println("不会");
        return true
    }
    

    这。。。

    相关文章

      网友评论

        本文标题:Java小白翻身 - Java接口教程,适合新人,通俗易懂1

        本文链接:https://www.haomeiwen.com/subject/apxapltx.html