容錯恢復機制
容錯恢復機制是應用程序開發中非常常見的功能。那么什么是容錯恢復呢?簡單點說就是:程序運行的時候,正常情況下應該按照某種方式來做,如果按照某種方式來做發生錯誤的話,系統並不會崩潰,也不會就此不能繼續向下運行了,而是有容忍出錯的能力,不但能容忍程序運行出現錯誤,還提供出現錯誤后的備用方案,也就是恢復機制,來代替正常執行的功能,使程序繼續向下運行。
舉個實際點的例子吧,比如在一個系統中,所有對系統的操作都要有日志記錄,而且這個日志還需要有管理界面,這種情況下通常會把日志記錄在數據庫里面,方便后續的管理,但是在記錄日志到數據庫的時候,可能會發生錯誤,比如暫時連不上數據庫了,那就先記錄在文件里面,然后在合適的時候把文件中的記錄再轉錄到數據庫中。
對於這樣的功能的設計,就可以采用策略模式,把日志記錄到數據庫和日志記錄到文件當作兩種記錄日志的策略,然后在運行期間根據需要進行動態的切換。
在這個例子的實現中,要示范由上下文來選擇具體的策略算法,前面的例子都是由客戶端選擇好具體的算法,然后設置到上下文中。
下面還是通過代碼來示例一下。
(1)先定義日志策略接口,很簡單,就是一個記錄日志的方法,示例代碼如下:
/**
* 日志記錄策略的接口
*/
public interface LogStrategy {
/**
* 記錄日志
* @param msg 需記錄的日志信息
*/
public void log(String msg);
}
(2)實現日志策略接口,先實現默認的數據庫實現,假設如果日志的長度超過長度就出錯,制造錯誤的是一個最常見的運行期錯誤,示例代碼如下:
/**
* 把日志記錄到數據庫
*/
public class DbLog implements LogStrategy{
public void log(String msg) {
//制造錯誤
if(msg!=null && msg.trim().length()>5){
int a = 5/0;
}
System.out.println("現在把 '"+msg+"' 記錄到數據庫中");
}
}
接下來實現記錄日志到文件中去,示例代碼如下:
/**
* 把日志記錄到文件
*/
public class FileLog implements LogStrategy{
public void log(String msg) {
System.out.println("現在把 '"+msg+"' 記錄到文件中");
}
}
(3)接下來定義使用這些策略的上下文,注意這次是在上下文里面實現具體策略算法的選擇,所以不需要客戶端來指定具體的策略算法了,示例代碼如下:
(4)看看現在的客戶端,沒有了選擇具體實現策略算法的工作,變得非常簡單,故意多調用一次,可以看出不同的效果,示例代碼如下:
(5)小結一下,通過上面的示例,會看到策略模式的一種簡單應用,也順便了解一下基本的容錯恢復機制的設計和實現。在實際的應用中,需要設計容錯恢復的系統一般要求都比較高,應用也會比較復雜,但是基本的思路是差不多的。
作者演示了策略的一種變體。
這個例子同時說明了設計中的另外一個重要的概念,單一職責原理。
單一職責原則(SRP),就一個類而言應該僅有一個引起它變化的原因。
如果一個類承擔的職責過多,就等於把這些職責耦合在一起,一個職責的變化可能會削弱或者抑制這個類完成其他職責的能力,這種耦合會導致脆弱的設計
當變化發生時,設計會遭受到意想不到的破壞。