還是用回那個計算器作例子.
用簡單工廠模式實現的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...