策略模式之C#版本(原创翻译版本)
来源:互联网 发布:unity3d图片格式 编辑:程序博客网 时间:2024/06/05 14:58
Definition
UML class diagram
Participants
The classes and/or objects participating in this pattern are:
- Strategy (SortStrategy)
- declares an interface common to all supported algorithms. Context uses this interface to call the algorithm defined by a ConcreteStrategy
- ConcreteStrategy (QuickSort, ShellSort, MergeSort)
- implements the algorithm using the Strategy interface
- Context (SortedList)
- is configured with a ConcreteStrategy object
- maintains a reference to a Strategy object
- may define an interface that lets Strategy access its data.
Sample code in C# download C# source code zip file
This structural code demonstrates the Strategy pattern which encapsulates functionality in the form of an object. This allows clients to dynamically change algorithmic strategies.
// Strategy pattern -- Structural example
using System;
// "Strategy"
abstract class Strategy
{
// Methods
abstract public void AlgorithmInterface();
}
// "ConcreteStrategyA"
class ConcreteStrategyA : Strategy
{
// Methods
override public void AlgorithmInterface()
{
Console.WriteLine(
"Called ConcreteStrategyA.AlgorithmInterface()");
}
}
// "ConcreteStrategyB"
class ConcreteStrategyB : Strategy
{
// Methods
override public void AlgorithmInterface()
{
Console.WriteLine(
"Called ConcreteStrategyB.AlgorithmInterface()");
}
}
// "ConcreteStrategyC"
class ConcreteStrategyC : Strategy
{
// Methods
override public void AlgorithmInterface()
{
Console.WriteLine(
"Called ConcreteStrategyC.AlgorithmInterface()");
}
}
// "Context"
class Context
{
// Fields
Strategy strategy;
// Constructors
public Context( Strategy strategy )
{
this.strategy = strategy;
}
// Methods
public void ContextInterface()
{
strategy.AlgorithmInterface();
}
}
/// <summary>
/// Client test
/// </summary>
public class Client
{
public static void Main( string[] args )
{
// Three contexts following different strategies
Context c = new Context( new ConcreteStrategyA() );
c.ContextInterface();
Context d = new Context( new ConcreteStrategyB() );
d.ContextInterface();
Context e = new Context( new ConcreteStrategyC() );
e.ContextInterface();
}
}
Output
Called ConcreteStrategyA.AlgorithmInterface()
Called ConcreteStrategyB.AlgorithmInterface()
Called ConcreteStrategyC.AlgorithmInterface()
This real-world code demonstrates the Strategy pattern which encapsulates sorting algorithms in the form of sorting objects. This allows clients to dynamically change sorting strategies including Quicksort, Shellsort, and Mergesort.
// Strategy pattern -- Real World example
using System;
using System.Collections;
// "Strategy"
abstract class SortStrategy
{
// Methods
abstract public void Sort( ArrayList list );
}
// "ConcreteStrategy"
class QuickSort : SortStrategy
{
// Methods
public override void Sort(ArrayList list )
{
list.Sort(); // Default is Quicksort
Console.WriteLine("QuickSorted list ");
}
}
// "ConcreteStrategy"
class ShellSort : SortStrategy
{
// Methods
public override void Sort(ArrayList list )
{
//list.ShellSort();
Console.WriteLine("ShellSorted list ");
}
}
// "ConcreteStrategy"
class MergeSort : SortStrategy
{
// Methods
public override void Sort( ArrayList list )
{
//list.MergeSort();
Console.WriteLine("MergeSorted list ");
}
}
// "Context"
class SortedList
{
// Fields
private ArrayList list = new ArrayList();
private SortStrategy sortstrategy;
// Constructors
public void SetSortStrategy( SortStrategy sortstrategy )
{
this.sortstrategy = sortstrategy;
}
// Methods
public void Sort()
{
sortstrategy.Sort( list );
}
public void Add( string name )
{
list.Add( name );
}
public void Display()
{
foreach( string name in list )
Console.WriteLine( " " + name );
}
}
/// <summary>
/// StrategyApp test
/// </summary>
public class StrategyApp
{
public static void Main( string[] args )
{
// Two contexts following different strategies
SortedList studentRecords = new SortedList( );
studentRecords.Add( "Samual" );
studentRecords.Add( "Jimmy" );
studentRecords.Add( "Sandra" );
studentRecords.Add( "Anna" );
studentRecords.Add( "Vivek" );
studentRecords.SetSortStrategy( new QuickSort() );
studentRecords.Sort();
studentRecords.Display();
}
}
Output
QuickSorted list
Anna
Jimmy
Samual
Sandra
Vivek
- 策略模式之C#版本(原创翻译版本)
- 策略模式之C++版本
- 策略模式c++版本
- spark内存分析模型(小于1.5版本)-无原文版本-原创翻译
- JavaScript版本的策略模式
- 策略(Strategy)模式(C#实现版本)
- [原创]项目svn版本控制中的分支策略
- 递归与分治策略之二分搜索(Java版本)
- Felomeng翻译:libsvm2.88之Java版本
- 配置管理之数据库版本控制策略
- c#调用R语言(原创翻译)
- C#设计模式之策略者模式(Stragety Pattern)
- 大话设计模式java版本 第二章 策略模式
- 【原创】【程序小游戏】迷宫(版本1)
- C# 设计模式之 策略模式 示例
- c#设计模式之策略模式
- C#设计模式之策略模式
- c#版本23个设计模式
- 半透明遮盖区域(层高级应用)
- 设计模式综述
- WebGIS小结之三(开发环境及其配置)
- 使用 em 指定字体尺寸时的麻烦
- [fy] 截取屏幕的3种实现
- 策略模式之C#版本(原创翻译版本)
- 错误“-2147024784”
- 几种调用WebService的方法
- Xml WebService完全实例解析(四)
- WebGIS小结之四(创建地图)
- 有关ASP的组件
- 策略模式之C++版本
- 哪里有8583协议开发的资料(有例子最好)
- 学习Java的笔记(5)