策略模式 Strategy 簡介

2021-06-27 14:14:48 字數 2121 閱讀 4172

還是用回那個計算器作例子.

用簡單工廠模式實現的uml圖是這樣的:

客戶端關鍵**:

private void btnclicked_b***el()
可見, 使用簡單工廠後,  在客戶端只知道演算法是operation的子類實現的,  但是不知道具體是哪個子類(operationadd 還是 operationdel).

也就是將真正的業務子類對客戶端隱藏了.

正專業的**就是把業務類封裝起來.

但是, 在上面的例子中, 即使使用了簡單工廠模式把業務類封裝起來,但是還是暴露了真正的演算法(方法)名字  getresult().

所謂策略模式其實跟簡單工廠模式在定義上有點類似, 只不過簡單工廠封裝的是業務類, 而策略模式封裝了方法(演算法),

也就講令客戶端無法知道真正的業務方法名字.

再簡單點講,

就是利用物件導向多型, 根據子類的不同而呼叫不同的重寫方法.

對於上面計算器的例子.

我們移除operationfactory類,   類似地, 新增1個叫做operationcontext的類, 它的作用有點類似與工廠類operationfactory

factory類:  工廠, 具有1個靜態方法. 根據引數的不同返回不同的類的物件. 通常不例項化工廠類, 只呼叫其靜態方法生成物件.

context類:    具有非靜態1個方法,  根據引數物件的不同呼叫相同(重寫自同一超類)的方法. 客戶端通常會例項化這個類.

上所提到的物件所屬的類都是繼承(或間接繼承)自同1個超類.

跟上次的例子變化不大, 加上了set方法.

public abstract class operation 

public void seti(int i)

public void setj(int j)

public int getj()

public abstract int getresult();

}

public class operationadd extends operation

}

public class operationdel extends operation

}

public class operationcontext 

public int compute(int i, int j)

}

可見它可以根據oper物件的不同, 而呼叫不同的同名方法,  這就是多型的基本特性!

private void btnclicked_b***el()

策略模式對客戶端封裝(隱藏)了 業務的具體方法,   也就是說上面例子中的客戶端呼叫operationcontext類的compute方法來計算, 而不知道真正的方法是getresutl().

但是上面的客戶端暴露了operationdel類...

而簡單工廠模式的好處就是可以封裝具體業務類.

所以將兩個模式結合就可以同時封裝業務類和業務方法(演算法).

簡單修改下operationcontext:

package strategy.bizobj;

public class operationcontext

//****** factory

public operationcontext(string symbol) }

public int compute(int i, int j)

}

上面的context類就是簡單工廠模式和策略模式的集合了.

此時的客戶端**:

private void btnclicked_b***el()
相當簡潔,同時隱藏(封裝)了業務類和業務方法.

擴充套件性同樣很強大, 如果需要增加乘法button, 只需要增加1個乘法類, 以及修改簡單工廠內的switch **.

策略模式(Strategy)簡介

策略模式是行為模式.行為模式 規定了各個物件應該具備的職責以及物件間的通訊模式,它很好的規範了物件間呼叫和資料傳遞方式 策略模式適合於演算法經常變化的情況 演算法的變化不會影響到使用演算法的客戶,演算法可以獨立於使用它的客戶所變化 普通客戶,會員,vip會員購買商品 不一樣 抽象類package s...

策略 Strategy 模式

strategy 模式也叫策略模式,是由 gof提出的 23種軟體設計模式的一種。strategy 模式是行為模式之一,它對一系列的演算法加以封裝,為所有演算法定義乙個抽象的演算法介面,並通過繼承該抽象演算法介面對所有的演算法加以封裝和實現,具體的演算法選擇交由客戶端決定 策略 strategy 模...

策略模式 Strategy

public context string strategytype df對策略模式的定義是這樣的 它定義了演算法家族,分別封裝起來,讓它們之間可以相互替換,此模式讓演算法的變化不會影響到使用演算法的客戶 main函式 abstract class strategy class concretest...