目錄
發現不少初學者,看教程能看得懂,例子也能做出來,但是在實際項目中怎麼操作,不懂!比如今天說的接口類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類,然後再寫一個實現類。這樣做是爲了方便擴展,不用再對原來的進行修改。