設計模式學習筆記 策略模式

2021-07-10 03:56:34 字數 2433 閱讀 1080

問題:商場收銀軟體,根據單價和數量,得到總價。

設計思路:兩個輸入框,分別代表單價和數量,乙個下拉框,選項有:正常,打折,滿減等演算法

商場有時需要正常收費,有時打折扣,有時滿300送100.下面是簡單工廠模式下:

所有演算法的父類抽象類cashsuper:

public abstract class cashsuper
其下的其他子類,分別代表不同的收費方式

/**

* @author xukai 打折收費

*/public class cashrebate extends cashsuper

@override

public double acceptcash(double money)

}

/**

* @author xukai 正常收費

*/public class cashnormal extends cashsuper

}

/**

* @author xukai

* 滿減收費

*/public class cashreturn extends cashsuper

@override

public double acceptcash(double money)

return result;

}}

工廠:根據下拉框選的不同,工廠生產不同的收費方式。

public class cashfactory 

return cs;

}}

使用簡單工廠模式解決的是物件的建立問題,工廠包括了所有的收費方式,商場更改打折額度和返利額度非常頻繁,那麼就要經常擴充套件收費方式,從而修改工廠,需要引進新的設計模式來解決這一問題。

策略模式定義:定義了演算法家族,分別封裝起來,讓它們之間可以相互替換,此模式讓演算法的變化,不會影響到使用演算法的客戶。

策略模式的實現:

相比簡單工廠模式,去掉了包含靜態方法的工廠類,新增了cashcontext收費上下文類:

public class cashcontext 

public double getresult(double money)

}

通過cashcontext進行呼叫,假如,需要新增乙個打七折的收費方式,只需要重新寫乙個cashrebate為0.7的類,不用改cashcontext中的實現。

測試方法:

public void btn_submit(double price,double count,string type)

system.out.println("總費為:" + cc.getresult(price*count));

}

這種辦法相當於把收費方式由客戶端進行判斷使用哪個演算法。

1.前者在內部建立需要的物件,後者物件已經建立完畢,只是呼叫不同的實現方法。

2.前者進入工廠之前是不存在的,返回的是要使用的物件。後者進入之前是該物件,返回依然是該物件。

3.前者生成演算法的判斷由工廠決定,後者由客戶端決定。

4.前者的客戶端需要識別所有演算法的父類cashsuper和工廠cashfactory,後者只需要識別cashcontext。

將物件的建立轉移到cashcontext中,客戶端不要判斷生成那個物件。

public class cashcontext 

} public double getresult(double money)

}

測試:
public class strategytest 

}

這種結合還是有弊端,新增其他演算法,必須修改cashcontext的switch分支。

策略模式是一種定義一系列演算法的方法,從概念上來將,這些演算法完成的都是相同的工作,只是實現不同。

定義演算法家族,分別封裝起來,讓它們之間可以相互轉換,此模式讓演算法的變化,不會影響到使用演算法的客戶。

策略模式的優點是簡化了單元測試,因為每個演算法都有自己的類,可以通過自己的介面單獨測試。

*使用場景:只要在分析過程中聽到需要在不同時間應用不同的業務規則,可以考慮使用策略模式處理這種變化的可能性,用來封裝演算法。

設計模式學習筆記 策略模式

我覺得策略模式與工廠方法模式極其相似!策略模式 工廠方法模式 如果單從圖來看,看不出有何相似之處。但看看呼叫方法就知道了 策略模式 context context new context abstractstrategy strategy 採用哪種策略,由呼叫方決定 strategy new con...

設計模式學習筆記 策略模式

考慮這樣乙個場景。我們要計算兩個數的值,但是演算法不確定,可以是加減乘除的任意一種,甚至可以是加減乘除任意組合計算。就實現方式來說可以有多種。比如我可以通過if else 繼續演算法控制 class context public function calculate flag else if fla...

二 策略模式 設計模式學習筆記

1 抽象策略角色 策略類,通常由乙個介面或者抽象類實現。定義了乙個公共介面,各種不同的演算法以不同的方式實現這個介面,context使用這個介面呼叫不同的演算法,一般使用介面或抽象類實現 2 具體策略角色 包裝了相關的演算法和行為。實現了strategy定義的介面,提供具體的演算法實現 3 環境角色...