策略模式 Strategy Pattern

2021-07-29 21:45:50 字數 2128 閱讀 9264

一、定義:

定義一組演算法, 將每個演算法都封裝起來, 並且使它們之間可以互換。

二、場景:

根據使用者給出的引數,計算出運算結果。

三、**:

calculator.class

/**

* 抽象介面,定義每個策略或演算法必須具有的方法和屬性

*/public

inte***ce

calculator

add.class

/**

* 加法演算法

*/public

class

addimplements

calculator

}

sub.class

/**

* 減法演算法

*/public

class

subimplements

calculator

}

context.class

/**

* 包裝類,上下文

*/public

class

context

public

intexec(int a,int b)

}

client.class

/**

* 場景類

*/public

class

client ;

int a=integer.parseint(args[0]);//參與演算法的數值

string symbol=args[1];//演算法策略標識

int b=integer.parseint(args[2]);//參與演算法的數值

context context=null;//封裝類例項

string tag="";//演算法的符號

if(symbol.equals("symbol_add"))else

if(symbol.equals("symbol_sub"))

if(context!=null)}}

運算結果:

四、角色:

● context封裝角色

它也叫做上下文角色, 起承上啟下封裝作用, 遮蔽高層模組對策略、 演算法的直接訪問,封裝可能存在的變化。例如:context.class

● strategy抽象策略角色

策略、 演算法家族的抽象, 通常為介面, 定義每個策略或演算法必須具有的方法和屬性。例如:calculator.class

● concretestrategy具體策略角色

實現抽象策略中的操作, 該類含有具體的演算法。例如:add.class,sub.class

五、優點:

● 演算法可以自由切換

這是策略模式本身定義的, 只要實現抽象策略, 它就成為策略家族的乙個成員, 通過封裝角色對其進行封裝, 保證對外提供「可自由切換」的策略。

● 避免使用多重條件判斷

如果沒有策略模式, 我們想想看會是什麼樣子? 乙個策略家族有5個策略演算法, 一會要使用a策略, 一會要使用b策略, 怎麼設計呢? 使用多重的條件語句? 多重條件語句不易維護, 而且出錯的概率大大增強。 使用策略模式後, 可以由其他模組決定採用何種策略, 策略家族對外提供的訪問介面就是封裝類, 簡化了操作, 同時避免了條件語句判斷。

● 擴充套件性良好

這甚至都不用說是它的優點, 因為它太明顯了。 在現有的系統中增加乙個策略太容易了, 只要實現介面就可以了, 其他都不用修改, 類似於乙個可反覆拆卸的外掛程式, 這大大地符合了ocp原則。

六、缺點:

● 策略類數量增多

每乙個策略都是乙個類, 復用的可能性很小, 類數量增多。

● 所有的策略類都需要對外暴露

七、使用場景:

● 多個類只有在演算法或行為上稍有不同的場景。

● 演算法需要自由切換的場景。

● 需要遮蔽演算法規則的場景

demo

模式 策略模式

前言 所有的設計模式都是基於程式設計屆前輩們的不斷實踐得出的解決一類問題中比較有效高效的程式設計方法。策略模式 策略模式用於解決業務中不同場景下統一行為的細微差別問題。策略模式遵循 開閉原則 舉個例子來說,在購物車功能中,結算 的時候會根據使用者的不同級別去打折,那麼打折計算 的這一行為就會有不同演...

策略模式(策略列舉)

首先定義乙個介面 package com.yecc.suanfa.strategy created by yecc on 2020 11 16 19 35 public inte ce strategy 定義三個繼承介面的類 package com.yecc.suanfa.strategy crea...

策略模式及Spring整合策略模式

抽象策略類 inte ce sortservice 具體策略類 class insertionsortserviceimpl implements sortservice else arr j 1 tmp return arr 氣泡排序 class bubblesortserviceimpl imp...