日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

《研磨设计模式》chap17 策略模式(2) 总结

發(fā)布時(shí)間:2025/3/21 asp.net 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《研磨设计模式》chap17 策略模式(2) 总结 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. 新增加context 上下文類

eg. 發(fā)工資:發(fā)人民幣和發(fā)美元

public interface PaymentStrategy {//公司給某人真正支付工資 public void pay(PaymentContext ctx); }public class RMBCash implements PaymentStrategy{ public void pay(PaymentContext ctx) { } }public class PaymentContext {//應(yīng)被支付工資的人員,簡(jiǎn)單點(diǎn),用姓名來(lái)代替 private String userName = null;//應(yīng)被支付的工資的金額 private double money = 0.0;//支付工資的方式策略的接口 private PaymentStrategy strategy = null;public PaymentContext(String userName,double money,PaymentStrategy strategy){this.userName = userName;this.money = money;this.strategy = strategy;}public void payNow(){//使用客戶希望的支付策略來(lái)支付工資this.strategy.pay(this);} }public static void main(String[] args) {//創(chuàng)建相應(yīng)的支付策略PaymentStrategy strategyRMB = new RMBCash();PaymentStrategy strategyDollar = new DollarCash(); //準(zhǔn)備小李的支付工資上下文PaymentContext ctx1 = new PaymentContext("小李",5000,strategyRMB);//向小李支付工資ctx1.payNow();

1.1 如果要新加一個(gè)功能,比如支付到銀行卡,可以新建一個(gè)context類

public class Card implements PaymentStrategy{ public void pay(PaymentContext ctx) { PaymentContext2 ctx2 = (PaymentContext2)ctx; //連接銀行,進(jìn)行轉(zhuǎn)帳,就不去管了} }public class PaymentContext2 extends PaymentContext {//銀行帳號(hào) private String account = null; public PaymentContext2(String userName,double money,String account,PaymentStrategy strategy){super(userName,money,strategy);this.account = account;}

1.2 把context傳給strategy

public class Card2 implements PaymentStrategy{ private String account = ""; public Card2(String account){this.account = account;}public void pay(PaymentContext ctx) { } }public static void main(String[] args) {PaymentStrategy strategyCard = new Card();PaymentContext ctx3 = new PaymentContext2("小王",9000,"010998877656",strategyCard);ctx3.payNow();

總結(jié):

  • 對(duì)于擴(kuò)展上下文的方式:這樣實(shí)現(xiàn),所有策略的實(shí)現(xiàn)風(fēng)格更統(tǒng)一,策略需要的數(shù)據(jù)都統(tǒng)一從上下文來(lái)獲取,這樣在使用方法上也很統(tǒng)一;另外,在上下文中添加新的數(shù)據(jù),別的相應(yīng)算法也可以用得上,可以視為公共的數(shù)據(jù)。但缺點(diǎn)也很明顯,如果這些數(shù)據(jù)只有一個(gè)特定的算法來(lái)使用,那么這些數(shù)據(jù)有些浪費(fèi);另外每次添加新的算法都去擴(kuò)展上下文,容易形成復(fù)雜的上下文對(duì)象層次,也未見得有必要。

  • 對(duì)于在策略算法的實(shí)現(xiàn)上添加自己需要的數(shù)據(jù)的方式:這樣實(shí)現(xiàn),比較好想,實(shí)現(xiàn)起來(lái)簡(jiǎn)單。但是缺點(diǎn)也很明顯,跟其他策略實(shí)現(xiàn)的風(fēng)格不一致,其他策略都是從上下文中來(lái)獲取數(shù)據(jù),而這個(gè)策略的實(shí)現(xiàn)一部分?jǐn)?shù)據(jù)來(lái)自上下文,一部分?jǐn)?shù)據(jù)來(lái)自自己,有些不統(tǒng)一;另外,這樣一來(lái),外部使用這些策略算法的時(shí)候也不一樣了,難于以一個(gè)統(tǒng)一的方式來(lái)動(dòng)態(tài)切換策略算法。

2. 容錯(cuò)恢復(fù)

log要么記錄到txt文件,或者記錄到數(shù)據(jù)庫(kù)。

public interface LogStrategy { public void log(String msg); }public class FileLog implements LogStrategy{public void log(String msg) { } }public class LogContext {//記錄日志 public void log(String msg){ LogStrategy strategy = new DbLog();try{strategy.log(msg);}catch(Exception err){//出錯(cuò)了,那就記錄到文件中strategy = new FileLog();strategy.log(msg);}} }public static void main(String[] args) {LogContext log = new LogContext();log.log("記錄日志");log.log("再次記錄日志");}

3. 策略模式加模板模式

好幾個(gè)策略有共同的部分。

public abstract class LogStrategyTemplate implements LogStrategy{ public final void log(String msg) {//第一步:給消息添加記錄日志的時(shí)間DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");msg = df.format(new java.util.Date())+" 內(nèi)容是:"+ msg;//第二步:真正執(zhí)行日志記錄doLog(msg);}//真正執(zhí)行日志記錄,讓子類去具體實(shí)現(xiàn) protected abstract void doLog(String msg); }

4. 總結(jié)

本質(zhì)還是“分離算法,選擇實(shí)現(xiàn)”,因?yàn)榉蛛x并封裝了算法,才能夠很容易地修改和添加算法;也能很容易地動(dòng)態(tài)切換使用不同的算法,也就是動(dòng)態(tài)選擇一個(gè)算法來(lái)實(shí)現(xiàn)需要的功能。

4. 1 上下文

如果沒(méi)有上下文,那么就需要客戶端來(lái)直接與具體的策略交互,尤其是當(dāng)需要提供一些公共功能,或者是相關(guān)狀態(tài)存儲(chǔ)的時(shí)候,會(huì)大大增加客戶端使用的難度。因此,引入上下文還是很必要的,有了上下文,這些工作就由上下文來(lái)完成了,客戶端只需要與上下文交互就可以了,這樣會(huì)讓整個(gè)設(shè)計(jì)模式更獨(dú)立、更有整體性,也讓客戶端更簡(jiǎn)單。

總結(jié)

以上是生活随笔為你收集整理的《研磨设计模式》chap17 策略模式(2) 总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。