比如在一個(gè)系統(tǒng)中,所有對(duì)系統(tǒng)的操作都要有日志記錄,而且這個(gè)日志還需要有管理界面米间,這種情況下通常會(huì)把日志記錄在數(shù)據(jù)庫(kù)里面,方便后續(xù)的管理膘侮,但是在記錄日志到數(shù)據(jù)庫(kù)的時(shí)候屈糊,可能會(huì)發(fā)生錯(cuò)誤,比如暫時(shí)連不上數(shù)據(jù)庫(kù)了琼了,那就先記錄在文件里面逻锐,然后在合適的時(shí)候把文件中的記錄再轉(zhuǎn)錄到數(shù)據(jù)庫(kù)中。
對(duì)于這樣的功能的設(shè)計(jì)雕薪,就可以采用策略模式昧诱,把日志記錄到數(shù)據(jù)庫(kù)和日志記錄到文件當(dāng)作兩種記錄日志的策略,然后在運(yùn)行期間根據(jù)需要進(jìn)行動(dòng)態(tài)的切換所袁。
單一職責(zé)原則(SRP)盏档,就一個(gè)類(lèi)而言應(yīng)該僅有一個(gè)引起它變化的原因。如果一個(gè)類(lèi)承擔(dān)的職責(zé)過(guò)多燥爷,就等于把這些職責(zé)耦合在一起蜈亩,一個(gè)職責(zé)的變化可能會(huì)削弱或者抑制這個(gè)類(lèi)完成其他職責(zé)的能力,這種耦合會(huì)導(dǎo)致脆弱的設(shè)計(jì)當(dāng)變化發(fā)生時(shí)局劲,設(shè)計(jì)會(huì)遭受到意想不到的破壞勺拣。
創(chuàng)建型模式:主要側(cè)重于對(duì)象的創(chuàng)建過(guò)程;
結(jié)構(gòu)型模式:主要側(cè)重于處理類(lèi)或?qū)ο蟮慕M合鱼填;
行為型模式:主要側(cè)重于類(lèi)或?qū)ο笾g的交互以及職責(zé)分配药有。
首先了解下策略模式的概念:定義了多個(gè)算法,并將它們封裝起來(lái)(一般的是每個(gè)算法封裝成一個(gè)單獨(dú)的類(lèi)),讓算法獨(dú)立于客戶(hù)端而可以單獨(dú)變化愤惰。
應(yīng)用場(chǎng)景:
1苇经、 多個(gè)類(lèi)只區(qū)別在表現(xiàn)行為不同,可以使用Strategy模式宦言,在運(yùn)行時(shí)動(dòng)態(tài)選擇具體要執(zhí)行的行為扇单。
2、 需要在不同情況下使用不同的策略(算法)奠旺,或者策略還可能在未來(lái)用其它方式來(lái)實(shí)現(xiàn)蜘澜。
3、 對(duì)客戶(hù)隱藏具體策略(算法)的實(shí)現(xiàn)細(xì)節(jié)响疚,彼此完全獨(dú)立鄙信。
針對(duì)同一命令(或行為),不同的策略做不同的動(dòng)作。
具體可以看一下下面的例子(以計(jì)算加忿晕、減装诡、乘為例):
1. 對(duì)加、減践盼、乘每個(gè)算各自封裝成一個(gè)類(lèi)鸦采,首先定義其共同的接口:
1interfaceICalculator{23publicintcalculator(inta,intb);45}
2. 分別定義加、減咕幻、乘算法類(lèi):
1classPlusimplementsICalculator {23@Override4publicintcalculator(inta,intb) {5returna +b;6}78}
1classMinusimplementsICalculator {23@Override4publicintcalculator(inta,intb) {5returna -b;6}78}
1classMultiplyimplementsICalculator {23@Override4publicintcalculator(inta,intb) {5returna *b;6}78}
3. 定義上下文環(huán)境類(lèi)渔伯,用于封裝各個(gè)算法類(lèi)操作:
1classContext{23privateICalculator iCalculator;45publicContext(ICalculator iCalculator){6this.iCalculator =iCalculator;7}89publicintcalculator(inta,intb){10returniCalculator.calculator(a, b);11}1213}
4. 測(cè)試:
1publicclassStrategyTest {23publicstaticvoidmain(String[] args) {4Context context =newContext(newPlus());5context.calculator(2, 3);6}78}