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

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

