Strategy Pattern (策略模式)
所謂 Strategy Pattern 的精神
若有多種「策略」
The Strategy Pattern defines a family of algorithms
- Design Patterns: Elements of Reusable Object
Strategy Pattern 適用的情景
應用中的許多類
根據運行環境的不同
針對給定的目的
需要封裝復雜的數據結構
同上
圖
using System;
using blogs
//客戶程序
public partial class _
{
protected void Page_Load(object sender
{
//執行對象
Context context;
context = new Context(new ConcreteStrategyA());
Response
context = new Context(new ConcreteStrategyB());
Response
context = new Context(new ConcreteStrategyC());
Response
}
}
namespace blogs
{
//抽象算法類 (亦可用接口)
abstract class Strategy
{
//算法需要完成的功能
public abstract string AlgorithmInterface();
}
//具體算法類A
class ConcreteStrategyA : Strategy
{
//算法A實現方法
public override string AlgorithmInterface()
{
return
}
}
//具體算法類B
class ConcreteStrategyB : Strategy
{
//算法B實現方法
public override string AlgorithmInterface()
{
return
}
}
//具體算法類C
class ConcreteStrategyC : Strategy
{
//算法C實現方法
public override string AlgorithmInterface()
{
return
}
}
//執行對象
class Context
{
Strategy strategy;
public Context(Strategy strategy) //構造函數
{
this
}
//執行對象依賴於策略對象的操作方法
public string ContextInterface()
{
return strategy
}
}
} // end of namespace
/*
結行結果:
算法A實現
算法B實現
算法C實現
*/
上方的「Shell (殼)」示例中
下方的圖
圖
using System;
using blogs
//客戶程序
public partial class _
{
String strLinuxText =
String strWindowsText =
protected void Page_Load(object sender
{
}
protected void DropDownList
{
switch(DropDownList
{
case
Label
//Label
break;
case
Label
//Label
break;
default:
Label
break;
}
}
}
namespace blogs
{
//抽象算法類 (亦可用接口)
public abstract class TextStrategy
{
protected String text;
public TextStrategy(String text) //構造函數
{
this
}
//算法需要完成的功能
public abstract String replaceChar();
}
//具體算法類A
public class LinuxStrategy : TextStrategy
{
public LinuxStrategy(String text) //構造函數
: base(text)
{
}
//算法A實現方法
public override String replaceChar()
{
text = text
return text;
}
}
//具體算法類B
public class WindowsStrategy : TextStrategy
{
public WindowsStrategy(String text) //構造函數
: base(text)
{
}
//算法B實現方法
public override String replaceChar()
{
text = text
return text;
}
}
//執行對象
public class ContextCharChange
{
//執行對象依賴於策略對象的操作方法
public static String contextInterface(TextStrategy strategy)
{
return strategy
}
}
} // end of namespace
圖
若未用任何 Pattern 的客戶程序
hard coding
protected void DropDownList
{
switch(DropDownList
{
case
Label
break;
case
Label
break;
default:
Label
break;
}
}
此外
Strategy Pattern 的優點
簡化了單元測試
避免程序中使用多重條件轉移語句
高內聚
Strategy Pattern 的缺點
因為每個具體策略都會產生一個新類
選擇所用具體實現的職責由客戶程序承擔
若要減輕客戶端壓力
此外
State
Strategy
State 中
From:http://tw.wingwit.com/Article/program/net/201311/12743.html