定义定义一组算法,并封装使其能相互切换。策略模式使得算法因客户使用不同而改变。
使用频度:
中高
UML 类图
参与者该模式参与的类或对象
- 定义所有算法支持的公共接口,Context会使用该接口调用ConcreteStategy定义的算法.
- ConcreteStrategy(具体策略,如快排,希尔排序,插入排序)
C# 示例代码 // Strategy pattern -- Structural example
using System;
namespace DoFactory.GangOfFour.Strategy.Structural
{
///
/// MainApp startup class for Structural
/// Strategy Design Pattern.
///
class MainApp
{
///
/// Entry point into console application.
///
static void Main()
{
Context context;
// Three contexts following different strategies
context = new Context(new ConcreteStrategyA());
context.ContextInterface();
context = new Context(new ConcreteStrategyB());
context.ContextInterface();
context = new Context(new ConcreteStrategyC());
context.ContextInterface();
// Wait for user
Console.ReadKey();
}
}
///
/// The 'Strategy' abstract class
///
abstract class Strategy
{
public abstract void AlgorithmInterface();
}
///
/// A 'ConcreteStrategy' class
///
class ConcreteStrategyA : Strategy
{
public override void AlgorithmInterface()
{
Console.WriteLine(
"Called ConcreteStrategyA.AlgorithmInterface()");
}
}
///
/// A 'ConcreteStrategy' class
///
class ConcreteStrategyB : Strategy
{
public override void AlgorithmInterface()
{
Console.WriteLine(
"Called ConcreteStrategyB.AlgorithmInterface()");
}
}
///
/// A 'ConcreteStrategy' class
///
class ConcreteStrategyC : Strategy
{
public override void AlgorithmInterface()
{
Console.WriteLine(
"Called ConcreteStrategyC.AlgorithmInterface()");
}
}
///
/// The 'Context' class
///
class Context
{
private Strategy _strategy;
// Constructor
public Context(Strategy strategy)
{
this._strategy = strategy;
}
public void ContextInterface()
{
_strategy.AlgorithmInterface();
}
}
}
|
输出:
Called ConcreteStrategyA.AlgorithmInterface()
Called ConcreteStrategyB.AlgorithmInterface()
Called ConcreteStrategyC.AlgorithmInterface()
|
阅读(1377) | 评论(0) | 转发(0) |