一个策略是一个计划,或是一个方案。通过执行这个计划或是方案,我们可以完成某个任务。策略与算法相比,策略能够在更大的范围内提供可选方案。策略是一组方案,这些方案可以相互之间替换。
利用策略模式,我们可以把相互之间可替换的方案封装在一些具有共同接口的类中,从而使得他们可以相互替换。共同接口定义了策略的输入和输出,操作的实现在各个类中完成。通过应用策略模式可以把用于选择策略的代码逻辑和策略本身的代码逻辑分离开来。
把一个操作分配到一组相关的类中,这点策略模式与状态模式是相同的,它们的不同之处在与状态模式注重与状态的变迁,而策略模式是注重解决方案的变化,思想上有很大的不同。
举例个开发中的例子,比如我们在网上提交一篇文章,那么网站后台可以有两种方式来完成:即同步提交或是异步提交来完成。同步提交和异步提交就是两种策略。我们可以在配置文件使用不同的配置来选择不同的策略,这样策略的改变不需要重新编译代码。
using
System;
using System.Collections.Generic;
using System.Text;
namespace StrategyPattern
{
/// <summary>
/// 共同接口,不同策略的类实现同这个共同接口
/// 第一步就是创建这个接口,定义策略的操作
/// </summary>
public interface IHandlingStrategy
{
/// <summary>
/// 提交
/// </summary>
/// <param name="article">文件对象</param>
void Sumbit(Article article);
/// <summary>
/// 根据标题查询文章
/// </summary>
/// <param name="articleName">标题</param>
/// <returns></returns>
IList<Article> Query(string articleName);
}
/// <summary>
/// 策略类一,使用同步操作的方式
/// </summary>
public class SynchroHandling : IHandlingStrategy
{
/// <summary>
/// 同步提交
/// </summary>
/// <param name="article">文件对象</param>
public void Sumbit(Article article)
{
//同提交过程省略
Console.WriteLine("同步提交!");
}
/// <summary>
/// 根据标题查询同步文章
/// </summary>
/// <param name="articleName">标题</param>
/// <returns></returns>
public IList<Article> Query(string articleName)
{
IList<Article> articles = new List<Article>();
Console.WriteLine("同步查询!");
//同查询过程省略
return articles;
}
}
/// <summary>
/// 策略类二,使用异步操作的方式
/// </summary>
public class AsynchronousHandling : IHandlingStrategy
{
/// <summary>
/// 异步提交
/// </summary>
/// <param name="article">文件对象</param>
public void Sumbit(Article article)
{
//异步提交过程省略
Console.WriteLine("异步提交!");
}
/// <summary>
/// 根据标题异步查询文章
/// </summary>
/// <param name="articleName">标题</param>
/// <returns></returns>
public IList<Article> Query(string articleName)
{
IList<Article> articles = new List<Article>();
Console.WriteLine("异步提查询!");
//异步查询过程省略
return articles;
}
}
/// <summary>
/// 实体对象
/// </summary>
public class Article
{
private string _articleName;
/// <summary>
/// 文章名称
/// </summary>
private string ArticleName
{
get
{
return _articleName;
}
set
{
_articleName = value;
}
}
private string _articleContent;
/// <summary>
/// 文章内容
/// </summary>
private string ArticleContent
{
get
{
return _articleContent;
}
set
{
_articleContent = value;
}
}
private DateTime _publishDateTime;
/// <summary>
/// 发表时间
/// </summary>
private DateTime PublishDateTime
{
get
{
return _publishDateTime;
}
set
{
_publishDateTime = value;
}
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="articleName">文章名称</param>
/// <param name="articleContent">文章内容</param>
/// <param name="publishDateTime">发表时间</param>
public Article(string articleName, string articleContent, DateTime publishDateTime)
{
this._articleName = articleName;
this._articleContent = articleContent;
this._publishDateTime = publishDateTime;
}
}
class Program
{
//------这个在实际的应用中可以从配置文件读取获得-----------------------
private static IHandlingStrategy GetHandlingStrategy()
{
bool isSynchro = true;//可以选择从从配置文件读取获得
IHandlingStrategy handlingStrategy = null;
if (isSynchro)
{
handlingStrategy = new SynchroHandling();
}
else
{
handlingStrategy = new AsynchronousHandling();
}
return handlingStrategy;
}
//------------------------------------------------------------------------
static void Main(string[] args)
{
IHandlingStrategy handlingStrategy = GetHandlingStrategy();
Article article = new Article("测试标题", "测试内容", DateTime.Now);
handlingStrategy.Sumbit(article);
Console.ReadLine();
}
}
}
using System.Collections.Generic;
using System.Text;
namespace StrategyPattern
{
/// <summary>
/// 共同接口,不同策略的类实现同这个共同接口
/// 第一步就是创建这个接口,定义策略的操作
/// </summary>
public interface IHandlingStrategy
{
/// <summary>
/// 提交
/// </summary>
/// <param name="article">文件对象</param>
void Sumbit(Article article);
/// <summary>
/// 根据标题查询文章
/// </summary>
/// <param name="articleName">标题</param>
/// <returns></returns>
IList<Article> Query(string articleName);
}
/// <summary>
/// 策略类一,使用同步操作的方式
/// </summary>
public class SynchroHandling : IHandlingStrategy
{
/// <summary>
/// 同步提交
/// </summary>
/// <param name="article">文件对象</param>
public void Sumbit(Article article)
{
//同提交过程省略
Console.WriteLine("同步提交!");
}
/// <summary>
/// 根据标题查询同步文章
/// </summary>
/// <param name="articleName">标题</param>
/// <returns></returns>
public IList<Article> Query(string articleName)
{
IList<Article> articles = new List<Article>();
Console.WriteLine("同步查询!");
//同查询过程省略
return articles;
}
}
/// <summary>
/// 策略类二,使用异步操作的方式
/// </summary>
public class AsynchronousHandling : IHandlingStrategy
{
/// <summary>
/// 异步提交
/// </summary>
/// <param name="article">文件对象</param>
public void Sumbit(Article article)
{
//异步提交过程省略
Console.WriteLine("异步提交!");
}
/// <summary>
/// 根据标题异步查询文章
/// </summary>
/// <param name="articleName">标题</param>
/// <returns></returns>
public IList<Article> Query(string articleName)
{
IList<Article> articles = new List<Article>();
Console.WriteLine("异步提查询!");
//异步查询过程省略
return articles;
}
}
/// <summary>
/// 实体对象
/// </summary>
public class Article
{
private string _articleName;
/// <summary>
/// 文章名称
/// </summary>
private string ArticleName
{
get
{
return _articleName;
}
set
{
_articleName = value;
}
}
private string _articleContent;
/// <summary>
/// 文章内容
/// </summary>
private string ArticleContent
{
get
{
return _articleContent;
}
set
{
_articleContent = value;
}
}
private DateTime _publishDateTime;
/// <summary>
/// 发表时间
/// </summary>
private DateTime PublishDateTime
{
get
{
return _publishDateTime;
}
set
{
_publishDateTime = value;
}
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="articleName">文章名称</param>
/// <param name="articleContent">文章内容</param>
/// <param name="publishDateTime">发表时间</param>
public Article(string articleName, string articleContent, DateTime publishDateTime)
{
this._articleName = articleName;
this._articleContent = articleContent;
this._publishDateTime = publishDateTime;
}
}
class Program
{
//------这个在实际的应用中可以从配置文件读取获得-----------------------
private static IHandlingStrategy GetHandlingStrategy()
{
bool isSynchro = true;//可以选择从从配置文件读取获得
IHandlingStrategy handlingStrategy = null;
if (isSynchro)
{
handlingStrategy = new SynchroHandling();
}
else
{
handlingStrategy = new AsynchronousHandling();
}
return handlingStrategy;
}
//------------------------------------------------------------------------
static void Main(string[] args)
{
IHandlingStrategy handlingStrategy = GetHandlingStrategy();
Article article = new Article("测试标题", "测试内容", DateTime.Now);
handlingStrategy.Sumbit(article);
Console.ReadLine();
}
}
}