動機:定義一系列演算法,把它們一個個封裝起來,並且使它們可互相替換。該模式使得演算法可獨立於使用它的客戶而變化。
情境:設計一個自動投票程式,根據常用投票對象的計票策略不同,定義一系列不同自動投票策略,可根據投票對象策略選用適當的自動投票策略。
結構
代碼
namespace DesignPattern.Strategy
{
public interface IVoteStrategy
{
void Vote();
// 統計投票情況
void Stat();
}
public class VoteStrategyA : IVoteStrategy
{
public void Vote()
{
}
public void Stat()
{
}
}
public class VoteStrategyB : IVoteStrategy
{
public void Vote()
{
}
public void Stat()
{
}
}
public class VoteStrategyC : IVoteStrategy
{
public void Vote()
{
}
public void Stat()
{
}
}
}
namespace DesignPattern.Strategy
{
public class AutoVote
{
private IVoteStrategy strategy;
public AutoVote(IVoteStrategy strategy)
{
this.strategy = strategy;
}
public IVoteStrategy Strategy
{
set
{
this.strategy = value;
}
}
public void Vote()
{
//
strategy.Vote();
}
public void Stat()
{
//
strategy.Stat();
}
}
}
要點:
1、Strategy及其子類為組件提供了一系列可重用的演算法,從而使得類型在運行時方便地根據需要在各個演算法之間進行切換,所謂封裝演算法,支援演算法的變化。
2、本模式提供了用條件判斷語句以外的另一種選擇,消除條件判斷語句,就是在解耦。含有許多條件判斷語句的代碼通常都需要本模式。
3、與State模式類似,如果Strategy對象沒有執行個體變數,那麼各個上下文可以共用同一個Strategy對象,從而節省對象開銷。