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

歡迎訪問 生活随笔!

生活随笔

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

asp.net

『设计模式』再谈Macdonald的汉堡口味--策略模式

發(fā)布時(shí)間:2023/12/15 asp.net 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 『设计模式』再谈Macdonald的汉堡口味--策略模式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

23種設(shè)計(jì)模式+額外常用設(shè)計(jì)模式匯總 (持續(xù)更新)
類的劃分原則
面向?qū)ο蟮木幊?#xff0c;并不是類越多越好,類的劃分是為了封裝,但分類的基礎(chǔ)是抽象,具有相同屬性和功能的對象的抽象集合才是類。

策略模式

1.定義

策略模式的用意是針對一組算法,將每一個(gè)算法封裝到具有共同接口的獨(dú)立的類中,從而使得它們可以相互替換。策略模式使得算法可以在不影響到客戶端的情況下發(fā)生變化。

使用策略模式可以把行為和環(huán)境分割開來。環(huán)境類負(fù)責(zé)維持和查詢行為類,各種算法則在具體策略類( ConcreteStrategy) 中提供。
由于算法和環(huán)境獨(dú)立開來,算法的增減、修改都不會影響環(huán)境和客戶端。當(dāng)出現(xiàn)新的促銷折扣或現(xiàn)有的折扣政策出現(xiàn)變化時(shí),只需要實(shí)現(xiàn)新的策略類,并在客戶端登記即可。策略模式相當(dāng)于"可插入式(Pluggable)的算法"。
策略模式是對算法的包裝,是把使用算法的責(zé)任和算法本身分割開,委派給不同的對象管理。
”準(zhǔn)備一組算法,并將每一個(gè)算法封裝起來,使得它們可以互換。

2.涉及角色

環(huán)境(Context) 角色:持有一個(gè)Strategy類的引用(上下文對象),負(fù)責(zé)和具體的策略類交互。
抽象策略(Strategy)角色:這是一個(gè)抽象角色,通常由一個(gè)接口或抽象類實(shí)現(xiàn)。此角色給出所有的具體策略類所需的接只。
具體策略(ConcreteStrategy) 角色:包裝了相關(guān)的算法或行為。

3.模式講解

策略模式功能:把具體算法從具體業(yè)務(wù)處理中獨(dú)立
策略模式與if-else語句:多個(gè)if-else出現(xiàn)考慮使用策略模式
算法的平等性:策略算法是形同行為的不同實(shí)現(xiàn)
誰來選擇具體策略算法:客戶端;由上下文來選擇具體的策略算法

4.應(yīng)用場景

出現(xiàn)同關(guān)個(gè)算法,有很多不同的實(shí)現(xiàn)的情況,可以使用策略模式來把這些“不同的實(shí)現(xiàn)”實(shí)現(xiàn)成為一個(gè)算法的類層次
出現(xiàn)抽象一個(gè)定義了很多行為的類,并且是通過多個(gè)if-else語句來選擇這些行為的情況,可以使用策略模式來代替這些條件語句

5.優(yōu)點(diǎn):

  • 策略模式可以避免讓客戶端涉及到不必要接觸到的復(fù)雜的和只與算法有關(guān)的數(shù)據(jù)。
  • 避免使用難以維護(hù)的多重條件選擇語句。
  • 更好的擴(kuò)展。

6.缺點(diǎn):

  • 上述策略模式,把分支判斷又放回到客戶端,要改變需求算法時(shí),還是要去更改客戶端的程序。
  • 客戶端必須知道所有的策略類,并自行決定使用哪一個(gè)策略類。這就意味著客戶端必須理解這些算法的區(qū)別,以便適時(shí)選擇恰當(dāng)?shù)乃惴悺?/li>
  • 增加了對象的數(shù)目。
  • 只適合扁平的算法結(jié)構(gòu)。

本質(zhì):分離算法,選擇實(shí)現(xiàn)。

深入:

  • 在策略模式中,通常是上下文使用具體的策略實(shí)現(xiàn)對象,反過來,策略實(shí)現(xiàn)對象也可以從上下文獲取所需要的數(shù)據(jù),因此可以將上下文當(dāng)參數(shù)傳遞給策略實(shí)現(xiàn)對象
  • 在這種情況下,上 下文封裝著具體策略對象進(jìn)行算法運(yùn)算所需要的數(shù)據(jù),具體策略對象通過回調(diào)上下文的方法來獲取這些數(shù)據(jù)。

兩種方式

1.擴(kuò)展上下文的方式

優(yōu)點(diǎn):

  • 所有策略的實(shí)現(xiàn)風(fēng)格更統(tǒng)一,策略需要的數(shù)據(jù)都統(tǒng)一從上下文來獲取,這樣在使用方法上也很統(tǒng)一;
  • 在上下文中添加新的數(shù)據(jù),別的相應(yīng)算法也可以用得上,可以視為公共的數(shù)據(jù)。

缺點(diǎn):

  • 如果只有一個(gè)特定的算法來使用這些數(shù)據(jù),那么這些數(shù)據(jù)有些浪費(fèi);
  • 另外每次添加新的算法都去擴(kuò)展上下文,容易形成復(fù)雜的上下文對象層次。
2.在策略算法的實(shí)現(xiàn)上添加自己需要的數(shù)據(jù)的方式

優(yōu)點(diǎn):

  • 比較好想,實(shí)現(xiàn)簡單

缺點(diǎn):

  • 跟其它策略實(shí)現(xiàn)的風(fēng)格不一致。
  • 外部使用這些策略算法的時(shí)候也不一樣了,不太好以一個(gè)統(tǒng)一的方式來動態(tài)切換策略算法。

實(shí)現(xiàn):

UML圖:

策略接口,抽象和接口都可以

package 策略模式;public abstract class Strategy {abstract public void realize_Strategy(); }

//具體的策略A

package 策略模式;public class Concrete_Strategy_A extends Strategy {@Overridepublic void realize_Strategy() {System.out.println("具體策略A的實(shí)現(xiàn)");} }

//具體的策略B

package 策略模式;public class Concrete_Strategy_B extends Strategy {@Overridepublic void realize_Strategy() {System.out.println("具體策略A的實(shí)現(xiàn)");} }

上下文類

package 策略模式;public class Context {private Strategy str;public Context(Strategy str) {this.str = str;}public void Context_Method(){str.realize_Strategy();} } package 策略模式;public class Client {public static void main(String[] args) {// TODO Auto-generated method stubContext con;Strategy strA = new Concrete_Strategy_A();con = new Context(strA);con.Context_Method();Strategy strB = new Concrete_Strategy_B();con = new Context(strB);con.Context_Method();}}

總結(jié)

以上是生活随笔為你收集整理的『设计模式』再谈Macdonald的汉堡口味--策略模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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