hualinux java 1.13:接口类interface在什么情况下使用

目录

一、接口是制定标准的

二、接口的作用

2.1 不使用接口类实现

2.1.1 代码目录结构

2.1.2 实现代码

2.1.3 不使用interface实现分析

2.2 添加使用方式实现

2.2.1 目录结构

2.2.2 相关代码

2.2.3 优缺点

三、总结


发现不少初学者,看教程能看得懂,例子也能做出来,但是在实际项目中怎么操作,不懂!比如今天说的接口类interface

 看infterface教程相信都能看得懂,例子也能看明白,但是一问实际项目中什么情况下才要使用infterface,傻了,没接触过啊!学而不能用,这情况太多了吧,所以今天就简单说一下interface在项目中一般是用来干嘛的。

如果本章有些看不懂的话,可以留在以后,或者私信我。

一、接口是制定标准的

看接口一些特性:

抽象方法的集合,包含类要实现的方法.

接口无法被实例化

接口不能包含成员变量,除了 static 和 final 变量。

接口不是被类继承了,而是要被类实现

接口支持多继承。

...

从上面的描述知道,我们要用类实现一个接口,又因接口只能是抽象方法,抽象方法继承必须实现的。那么可以得出一个小结:当有些方法必须强制实现的时候就用接口.

说白了就是制定标准。接口在实际应用中更多的作用是来指定标准的。

 

二、接口的作用

我这里先不说直接说它的使用,先通过例子分析一下,我就截一个小功能说一下

一般的电商网站都要求登陆,用户名和密码保存在数据库中,如mysql数据库,为了安全一般用户密码是加密保存的。用户密码常用的加密算法有

MD5、SHA256、Bcrypt、Scrypt、ARGON2等

前期我就拿2前面2个加密算法,为了方便初学者理解我这里不写实现过程,直接输出

2.1 不使用接口类实现

我在这里先不使用interface接口,直接使用一个类实现

2.1.1 代码目录结构

我是用《hualinux java 1.5:java开发工具idea 2020安装及配置》中用idea建立的myjava项目的基础上进行编写的,代码的目录结构如下

UserEncrypt:这个类文件是用户加密算法文件

UserMain:这个是main执行类,主要是调用 UserEncrypt对用户密码进行加密

2.1.2 实现代码

为一方便新手了解,我就不对加密部分实现加密逻辑,java有现成的加密类或者加密工具如hutool中的加密工具,直接调用就好了

com.hualinux.user.UserEncrypt代码如下:

注:如果你的目录名和我上面截图不同的话,需要修改一下package包名

package com.hualinux.user;

public class UserEncrypt {
    enum EncryptType{
        //不可逆,
        MD5,
        //不可逆
        SHA256
    };

    //type表示加密类型、params表示需要加密的字符
    public String encrypt(EncryptType  type ,String password){
        switch (type){
            case MD5:
                // 此处进行md5加密算法,为了方便直接使用输出,不实现加密逻辑
                passWord="经过md5加密过数据";
                return passWord;
            case SHA256:
                // 此处进行SHA256加密算法
                passWord="经过SHA256加密过数据";
                return passWord;
            default:
                return "没有找到对应的加密算法";
        }
    }

}

com.hualinux.user.UserMain.java代码

package com.hualinux.user;

public class UserMain {
    public static void main(String[] args) {
        UserEncrypt userEncrypt=new UserEncrypt();
        //MD5不安全使用SHA256对用户进行加密
        System.out.println(userEncrypt.encrypt(UserEncrypt.EncryptType.SHA256,"hualinux"));
    }
}

运行UserMain结果:

 

2.1.3 不使用interface实现分析

通过上面2.1.2代码实现功能,从功能性上来说没有毛病。但是我们需求会经常变的,过两年发现MD5和SHA256加密都不安全了,推荐用Bcrypt,于是你得增加Bcrypt加密吧,后来又说Scrypt更好,又增加Scrypt,现在又推荐Argon2

上面的代码可以看出如果要继续增加其他方式的加密算法的时候,只有通过增加EncryptType枚举类型,然后增加类型判断。

我们一般说来好的代码要灵活、强壮、易于使用、阅读和维护

你直接修改了代码是不是破解了源代码,UsrMain直接调用了UserEncrypt类,是不是联系性很高(专业的叫偶合性很紧)

我们在给程序添加功能的时候是不是尽量不修改源代码的前提下进行扩展,这样就不会影响原来的功能,又可以添加新的功能。

PS:实际开发中原比添加多几个加密算法复杂,而是直接添加模块,添加功能。

这样就对源码进行了修改,因为太复杂了,经常有些开发没有看完整个源代码,网站太复杂也没有多少人有精力看完整个代码,造成了有一个漏改,因增加新功能而影响了原来功能,如果是涉及金钱的就直接造成损失了。找了半天也不知道漏了哪个,不得已又退回原来版本,这例子太多了。

我们进行修改一下,使用

2.2 添加使用方式实现

我们把上面的源代码进行分析如下:

2.2.1 目录结构

2.2.2 相关代码

1.声明加密接口

com.hualinux.user.UserEncrypt.java代码

package com.hualinux.user;

public interface UserEncrypt {
    String encryptStr(String password);
}

2.用继承的方式添加不同的实现

com.hualinux.user.MD5.java代码,为了查看原密码是多少,我添加多了个密码输出

package com.hualinux.user;

public class MD5 implements UserEncrypt {
    @Override
    public String encryptStr(String password) {
        System.out.println(password);
        return "经过MD5加密的数据";
    }
}

com.hualinux.user.SHA256.java代码

package com.hualinux.user;

public class SHA256 implements UserEncrypt {
    @Override
    public String encryptStr(String password) {
        System.out.println(password);
        return "经过SHA256加密的数据";
    }
}

3.利用对象多态的特性实现选择不同加密方式

com.hualinux.user.EncryptUnit.java

package com.hualinux.user;

public class EncryptUnit {
    public String encrypt(UserEncrypt userEncrypt,String password) {
        return userEncrypt.encryptStr(password);
    }
}

4.使用SHA256加密算法

com.hualinux.user.UserMain.java代码

package com.hualinux.user;

public class UserMain {
    public static void main(String[] args) {
        EncryptUnit encryptUnit=new EncryptUnit();
        System.out.println(encryptUnit.encrypt(new SHA256(),"123456"));
    }
}

5.效果

运行UserMain.java类,效果如下:

发现输入的123456密码,也能获取到,也进行了加密了

2.2.3 优缺点

从上面使用接口的例子,可以看出如果再添加一个加密算法,只需要添加一个类,继续接口,再在main指定使用该加密算法就行了。我们把上现代码实现过程用专业的名字叫“策略模式

优点:

1、 简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。 
2、 避免程序中使用多重条件转移语句,使系统更灵活,并易于扩展。 
3、 遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。

缺点: 
1、 因为每个具体策略类都会产生一个新类,所以会增加系统需要维护的类的数量。

2、 在基本的策略模式中,选择所用具体实现的职责由客户端对象承担,没有解除客户端需要选择判断的压力

三、总结

当一个模块依赖的是一个抽象接口的时候,就可以随意对这个抽象接口进行扩展,这个时候,不需要对现有代码进行任何修改,利用接口的多态性,通过增加一个新实现该接口的实现类,就能完成需求变更。

比如:

我们在MVC中service和dao层,通常先写一个interface类,然后再写一个实现类。这样做是为了方便扩展,不用再对原来的进行修改。

猜你喜欢

转载自blog.csdn.net/hualinux/article/details/106758657
今日推荐