什么是策略模式
在策略模式(Strategy Pattern)中,一個(gè)類的行為或其算法可以在運(yùn)行時(shí)更改惦界。這種類型的設(shè)計(jì)模式屬于行為型模式傻工。
在策略模式中,我們創(chuàng)建表示各種策略的對(duì)象和一個(gè)行為隨著策略對(duì)象改變而改變的 context 對(duì)象孵滞。策略對(duì)象改變 context 對(duì)象的執(zhí)行算法中捆。
策略模式介紹
意圖:定義一系列的算法,把它們一個(gè)個(gè)封裝起來, 并且使它們可相互替換。
主要解決:在有多種算法相似的情況下坊饶,使用 if...else 所帶來的復(fù)雜和難以維護(hù)泄伪。
何時(shí)使用:一個(gè)系統(tǒng)有許多許多類,而區(qū)分它們的只是他們直接的行為匿级。
如何解決:將這些算法封裝成一個(gè)一個(gè)的類蟋滴,任意地替換。
關(guān)鍵代碼:實(shí)現(xiàn)同一個(gè)接口痘绎。
應(yīng)用實(shí)例:
1津函、諸葛亮的錦囊妙計(jì),每一個(gè)錦囊就是一個(gè)策略孤页。
2尔苦、旅行的出游方式,選擇騎自行車行施、坐汽車允坚,每一種旅行方式都是一個(gè)策略。
3蛾号、JAVA AWT 中的 LayoutManager稠项。
優(yōu)點(diǎn): 1、算法可以自由切換鲜结。 2展运、避免使用多重條件判斷活逆。 3、擴(kuò)展性良好乐疆。
缺點(diǎn): 1划乖、策略類會(huì)增多。 2挤土、所有策略類都需要對(duì)外暴露琴庵。
使用場(chǎng)景:
1、如果在一個(gè)系統(tǒng)里面有許多類仰美,它們之間的區(qū)別僅在于它們的行為迷殿,那么使用策略模式可以動(dòng)態(tài)地讓一個(gè)對(duì)象在許多行為中選擇一種行為。
2咖杂、一個(gè)系統(tǒng)需要?jiǎng)討B(tài)地在幾種算法中選擇一種庆寺。
3、如果一個(gè)對(duì)象有很多的行為诉字,如果不用恰當(dāng)?shù)哪J脚吵ⅲ@些行為就只好使用多重的條件選擇語(yǔ)句來實(shí)現(xiàn)。
注意事項(xiàng):如果一個(gè)系統(tǒng)的策略多于四個(gè)壤圃,就需要考慮使用混合模式陵霉,解決策略類膨脹的問題。
下面就是我在項(xiàng)目中使用網(wǎng)絡(luò)請(qǐng)求伍绳,后期這塊需要下沉到native踊挠,也有可能需要tcp 變成http
實(shí)現(xiàn)
- 定義接口
public interface ImNettyLoader {
public abstract void nativeInitSdk(long paramLong, String paramString1, String paramString2, String paramString3, String paramString4, String paramString5, int paramInt, boolean paramBoolean1, boolean paramBoolean2, boolean paramBoolean3);
public abstract void nativeUnInitSdk();
public abstract void nativeLogin(String paramString1, String paramString2, ICallback paramICallback);
...
}
- 創(chuàng)建實(shí)現(xiàn)接口的實(shí)體類
public class NettyLoad implements ImNettyLoader {
private Context mContext;
public NettyLoad(Context context) {
mContext = context;
}
@Override
public void nativeInitSdk(long paramLong, String paramString1, String paramString2, String paramString3, String paramString4, String paramString5, int paramInt, boolean paramBoolean1, boolean paramBoolean2, boolean paramBoolean3) {
}
@Override
public void nativeUnInitSdk() {
}
}
public class NativeLoad implements ImNettyLoader {
@Override
public void nativeInitSdk(long paramLong, String paramString1, String paramString2, String paramString3, String paramString4, String paramString5, int paramInt, boolean paramBoolean1, boolean paramBoolean2, boolean paramBoolean3) {
}
@Override
public void nativeUnInitSdk() {
}
@Override
public void nativeLogin(String paramString1, String paramString2, ICallback paramICallback) {
}
}
public class Httpload implements ImNettyLoader {
@Override
public void nativeInitSdk(long paramLong, String paramString1, String paramString2, String paramString3, String paramString4, String paramString5, int paramInt, boolean paramBoolean1, boolean paramBoolean2, boolean paramBoolean3) {
}
@Override
public void nativeUnInitSdk() {
}
@Override
public void nativeLogin(String paramString1, String paramString2, ICallback paramICallback) {
}
}
- 創(chuàng)建實(shí)現(xiàn)代理類
public class ImLoaderProxy implements ImNettyLoader {
private ImNettyLoader mImNettyLoader;
private static volatile ImLoaderProxy instance;
public static ImLoaderProxy getInstance() {
if (instance == null) {
synchronized (ImLoaderProxy.class) {
if (instance == null) {
instance = new ImLoaderProxy();
}
}
}
return instance;
}
private ImLoaderProxy() {
}
public void init(ImNettyLoader imageLoader) {
mImNettyLoader = imageLoader;
}
@Override
public void nativeInitSdk(long paramLong, String paramString1, String paramString2, String paramString3, String paramString4,
String paramString5, int paramInt, boolean paramBoolean1, boolean paramBoolean2, boolean paramBoolean3) {
mImNettyLoader.nativeInitSdk(paramLong, paramString1, paramString2, paramString3, paramString4, paramString5, paramInt, paramBoolean1
, paramBoolean2, paramBoolean3);
}
...
}
- 使用
初始化時(shí),在init(這里放入你想使用具體的策略)
ImLoaderProxy.getInstance().init(new NettyLoad(context));