本文內容基於《大話設計模式》——程傑,建議大家讀讀原著
1 我們要考慮什麼?
1)爲了提高程序的可維護性,需要對各個模塊之間進行解耦,要讓它們之間的關聯儘可能地小。避免修改其中一個模塊的時候,需要對另一個模塊大動干戈。
2)前端與後端要儘可能地分離解耦,原因還是與1)相同,提高程序的可維護性。前端是程序展示在用戶面前的界面,而後端是每一個按鈕或者是效果的具體實現。
3)對於前端的校驗。這一塊是基於程序安全性的考慮。不要忽視這一點。這不光包括用戶輸入的內容,還包括用戶可能僞裝成瀏覽器發送的給服務端的內容
2 關於前端的校驗
對於第三條舉兩個的例子
1)把 0 最爲除數。但這個很容易用try{}catch{}接住解決問題
2)sql 注入攻擊,這是一個十分重要的例子。在java連接數據庫時,由於使用了sql語法的字符串向數據庫發送命令,如果不檢驗用戶填寫的數據就會引發危險。
比如
select * from 數據庫名 where username='用戶名' && password='密碼'
該語句用於數據庫中查詢一條記錄,而其中的用戶名和密碼可能是從前端通過GET或者POST方法得到的。
那麼如果有別有用心的人,模擬瀏覽器使用GET和POST方法向服務器發送用戶名和密碼爲:a’ or ‘a’='a
那麼發送的sql語句就變成了
select * from 數據庫名 where username='a' or 'a'='a' && password='a' or 'a'='a'
這條語句將查詢數據庫的所有記錄,所以記錄一定存在。此時,即便用戶名和密碼錯誤,用戶仍舊可以登錄進網站。
3 簡單工廠
將界面的展示和功能的實現彼此分離開。並且將每一個功能包裝成一個類。這樣還不夠,爲了方便前端使用,我們還要把所有功能彙總成一個工廠,前端只能通過這個工程創建實例,在創建實例的時候全自動實現對應的功能。這樣就實現了前後端的解耦。
比如我想設計一個計算器,計算器中有 123456789±*/ 這些按鈕。這些按鈕的界面由前端設計好,後端只負責用戶點擊某一個按鈕時實現的功能。
比如點擊了 + 和 - 這個按鈕
public class add{
public add(){
在屏幕上顯示加號;
}
}
public class minus{
public minus(){
在屏幕上顯示減號
}
}
考慮到方便讓前端調用,所以建立了簡單工廠,即讓前端通過一條命令就可以實現一個功能的操作
比如要求 Operation.createOperation("+") 這句話實現加操作,
Operation.createOperation("-") 這句話實現減操作。
public class Operation{
public static void createOperation(String operation){
switch(operation){
case "+":
new add();
case "-":
new minus();
}
}
}
這麼做,那前端的負擔就減小了,只要在 + 按鈕的監聽器內部寫入這句話就行了。當這個 + 號功能出現了問題,前端不需要修改 + 按鈕監聽器的內容,只需要後端工程師檢查 add 類有沒有問題就好了。
但是需要注意,如果 add 類和 minus 類都有返回參數的話需要使得 add 和 minus 類繼承同一個類或者實現同一個接口,比如 A ,然後在簡單工廠內,返回 A 類或接口即可,此時前端接收需要強轉。