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