這段時(shí)間在項目中接觸到了Strategy策略模式,所以就學(xué)習了一下,做一個(gè)總結。
Strategy策略模式是一種對象行為模式。主要是應對:在軟件構建過(guò)程中,某些對象使用的算法可能多種多樣,經(jīng)常發(fā)生變化。如果在對象內部實(shí)現這些算法,將會(huì )使對象變得異常復雜,甚至會(huì )造成性能上的負擔。
GoF《設計模式》中說(shuō)道:定義一系列算法,把它們一個(gè)個(gè)封裝起來(lái),并且使它們可以相互替換。該模式使得算法可獨立于它們的客戶(hù)變化。
Strategy模式的結構圖如下:
從圖中我們不難看出:Strategy模式實(shí)際上就是將算法一一封裝起來(lái),如圖上的ConcreteStrategyA、ConcreteStrategyB、ConcreteStrategyC,但是它們都繼承于一個(gè)接口,這樣在Context調用時(shí)就可以以多態(tài)的方式來(lái)實(shí)現對于不用算法的調用。
Strategy模式的實(shí)現如下:
我們現在來(lái)看一個(gè)場(chǎng)景:我在下班在回家的路上,可以有這幾種選擇,走路、騎車(chē)、坐車(chē)。首先,我們需要把算法抽象出來(lái):
public interface IStrategy
{
void OnTheWay();
}
接下來(lái),我們需要實(shí)現走路、騎車(chē)和坐車(chē)幾種方式。
public class WalkStrategy : IStrategy
{
public void OnTheWay()
{
Console.WriteLine("Walk on the road");
}
}
public class RideBickStragtegy : IStrategy
{
public void OnTheWay()
{
Console.WriteLine("Ride the bicycle on the road");
}
}
public class CarStragtegy : IStrategy
{
public void OnTheWay()
{
Console.WriteLine("Drive the car on the road");
}
}
最后再用客戶(hù)端代碼調用封裝的算法接口,實(shí)現一個(gè)走路回家的場(chǎng)景:
class Program
{
static void
{
Console.WriteLine("Arrive to home");
IStrategy strategy = new WalkStrategy();
strategy.OnTheWay();
Console.Read();
}
}
運行結果如下;
Arrive to home
Walk on the road
如果我們需要實(shí)現其他的方法,只需要在Context改變一下IStrategy所示例化的對象就可以。
Strategy模式的要點(diǎn):
1、Strategy及其子類(lèi)為組件提供了一系列可重用的算法,從而可以使得類(lèi)型在運行時(shí)方便地根據需要在各個(gè)算法之間進(jìn)行切換。所謂封裝算法,支持算法的變化。
2、Strategy模式提供了用條件判斷語(yǔ)句以外的另一中選擇,消除條件判斷語(yǔ)句,就是在解耦合。含有許多條件判斷語(yǔ)句的代碼通常都需要Strategy模式。
3、Strategy模式已算法為中心,可以和Factory Method聯(lián)合使用,在工廠(chǎng)中使用配制文件對變化的點(diǎn)進(jìn)行動(dòng)態(tài)的配置。這樣就使變化放到了運行時(shí)。
4、與Template Method相比,Strategy模式的中心跟集中在方法的封裝上

