Java設(shè)計(jì)模式之策略模式詳細(xì)解析
策略模式基本介紹
策略模式(Strategy Pattern)中,定義算法族,分別封裝起來,讓他們之間可以相互轉(zhuǎn)化,此模式讓算法的變化獨(dú)立于使用算法的客戶。
算法體現(xiàn)的設(shè)計(jì)原則:
- 把變化的代碼從不變的代碼中分離出來
- 針對接口編程而不是具體類(定義了策略接口)
- 多用組合/聚合,少用繼承(通過使用組合方式使用策略模式)
策略模式實(shí)例
例如一個(gè)支付折扣服務(wù),根據(jù)會(huì)員的不同等級進(jìn)行不同的折扣,初級會(huì)員打9折,中級會(huì)員打8折,高級會(huì)員打7折
會(huì)員接口
public interface Member {
public void discount();
}
三個(gè)不同等級會(huì)員實(shí)現(xiàn)類
public class JuniorMember implements Member{
@Override
public void discount() {
System.out.println("初級會(huì)員打9折");
}
}
public class AssociateMember implements Member{
@Override
public void discount() {
System.out.println("中級會(huì)員打8折");
}
}
public class SeniorMember implements Member{
@Override
public void discount() {
System.out.println("高級會(huì)員打7折");
}
}
傳統(tǒng)模式
折扣服務(wù)類
public class DiscountService {
Member member;
public void payment(MemberType memberType){
if(memberType==MemberType.JUNIOR){
member = new JuniorMember();
member.discount();
}else if(memberType==MemberType.ASSOCIATE){
member = new AssociateMember();
member.discount();
} else if (memberType==MemberType.SENIOR) {
member = new SeniorMember();
member.discount();
}
}
}
enum MemberType{
ASSOCIATE,
JUNIOR,
SENIOR
}
客戶端類
public class Client {
public static void main(String[] args){
DiscountService discountService = new DiscountService();
System.out.println("--------------使用傳統(tǒng)模式--------------");
discountService.payment(MemberType.SENIOR);
discountService.payment(MemberType.ASSOCIATE);
discountService.payment(MemberType.JUNIOR);
}
}
/**
* --------------使用傳統(tǒng)模式--------------
* 高級會(huì)員打7折
* 中級會(huì)員打8折
* 初級會(huì)員打9折
*/
雖然可以用if else 滿足需求,但是不滿足開閉原則(對擴(kuò)展開放,對修改關(guān)閉),如果新增會(huì)員類型,或者下架原有會(huì)員類型,要對折扣服務(wù)類進(jìn)行修改,擴(kuò)展性很差??梢妭鹘y(tǒng)模式弊端十分大。
策略模式
折扣服務(wù)類
public class DiscountService {
Member member;
DiscountService(Member member){
this.member = member;
}
public void setMember(Member member) {
this.member = member;
}
public void payment(){
member.discount();
}
}
客戶端類
public class Client {
public static void main(String[] args) {
System.out.println("------------使用策略模式------------");
DiscountService discountService = new DiscountService(new JuniorMember());
discountService.payment();
discountService.setMember(new AssociateMember());
discountService.payment();
discountService.setMember(new SeniorMember());
discountService.payment();
}
}
/**
* ------------使用策略模式------------
* 初級會(huì)員打9折
* 中級會(huì)員打8折
* 高級會(huì)員打7折
*/
這里將Menber策略接口作為參數(shù)組合到折扣服務(wù)類,不需要寫復(fù)雜的 if else,滿足開閉原則,增加新的會(huì)員類,折扣服務(wù)類也不需要修改,并且對其他會(huì)員折扣的業(yè)務(wù)邏輯不會(huì)造成影響
JDK中使用策略模式的例子
在JDK中Arrays類中,sort(T[] a, Comparator<? super T> c)方法就是使用了策略模式,Comparator就是一個(gè)策略接口,方法中傳入了一個(gè)具體的排序策略實(shí)現(xiàn)類,根據(jù)不同的排序策略,進(jìn)行不同方式的排序

使用場景
- 如果在一個(gè)系統(tǒng)里面有許多類,它們之間的區(qū)別僅在于它們的行為,那么使用策略模式可以動(dòng)態(tài)地讓一個(gè)對象在許多行為中選擇一種行為。
- 一個(gè)系統(tǒng)需要?jiǎng)討B(tài)地在幾種算法中選擇一種。
- 如果一個(gè)對象有很多的行為,如果不用恰當(dāng)?shù)哪J?,這些行為就只好使用多重的條件選擇語句來實(shí)現(xiàn)。
到此這篇關(guān)于Java設(shè)計(jì)模式之策略模式詳細(xì)解析的文章就介紹到這了,更多相關(guān)Java策略模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring boot 應(yīng)用實(shí)現(xiàn)動(dòng)態(tài)刷新配置詳解
這篇文章主要介紹了spring boot 配置動(dòng)態(tài)刷新實(shí)現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-09-09
Java selenium上傳文件的實(shí)現(xiàn)
本文主要介紹了Java selenium上傳文件的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
Mybatis-Plus實(shí)現(xiàn)SQL攔截器的示例
這篇文章主要介紹了Mybatis-Plus實(shí)現(xiàn)一個(gè)SQL攔截器,通過使用SQL攔截器,開發(fā)人員可以在執(zhí)行SQL語句之前或之后對其進(jìn)行修改或記錄,從而更好地控制和優(yōu)化數(shù)據(jù)庫操作,對Mybatis-Plus?SQL攔截器相關(guān)知識感興趣的朋友一起看看吧2023-05-05
Java中的ArrayList.trimToSize()方法詳解
這篇文章主要介紹了Java中的ArrayList.trimToSize()方法詳解,前幾天看了Java?ArrayList,沒有明白trimToSize()這個(gè)方法是什么意思,所以看了一下源碼并且debug一下自己的一個(gè)例子,明白了其中的含義,需要的朋友可以參考下2023-11-11
詳細(xì)聊一聊java語言中的package和import機(jī)制
這篇文章主要給大家介紹了關(guān)于java語言中package和import機(jī)制的相關(guān)資料,Java中的package是指將相關(guān)的類組織在一起的一種機(jī)制,它可以用來避免命名沖突,也可以方便地管理和維護(hù)代碼,需要的朋友可以參考下2024-01-01

