一、什么是策略模式

  定义:定义一系列算法,把一个个算法封装成独立类并实现同一个接口,使得它们之间可以相互替换。

二、怎么使用策略模式

  首先模拟一个场景:有一个用户想买车。  可以有多种方式买车:

  (1)我是土豪,全款买

  (2)5成首付,5成贷款

  (3)0首付,全贷款

  抽象策略:定义一个行为接口, 接口内定义一个买车的方法  

//定义一个策略行为接口
public interface IStrategy
{
//购车
void BuyCar()
}

  具体策略:把购车方式看作一个个算法封装成独立类并实现购车行为

//购车方式 1
public class FullBuy : IStrategy
{
public void BuyCar()
{
Console.WriteLine("我是土豪,全款买");
}
}
//购车方式 2
public class HalfLoan : IStrategy
{
public void BuyCar()
{
Console.WriteLine("5成首付,5成贷款");
}
}
//购车方式 3
public class FullLoan : IStrategy
{
public void BuyCar()
{
Console.WriteLine("0首付,全贷款 ");
}
}

  环境角色:一个可以维护买车策略的对象

//定义一个类维护操作策略
public class StrategyContext
{
private IStrategy _myStrategy;
//初始化并传入具体购车方式
public StrategyContext(IStrategy myStrategy)
{
this._myStrategy = myStrategy;
}
//设置具体购车方式
public void SetStrategy(IStrategy myStrategy)
{
this._myStrategy = myStrategy;
} public void ExecBuy()
{
this._myStrategy.BuyCar();
}
}
//程序入口
public class Program
{
public static void Main(string[] args)
{
//创建购车方式
IStrategy strategy = new FullBuy();
//创建操作策略
StrategyContext myContext = new StrategyContext(strategy);
//买车
myContext.ExecBuy();
}
}

三、为什么使用策略模式

  在有多种算法相似的情况下,避免使用多重条件语句(使用 if...else 不易维护)  

 //不使用策略模式情况下,实现上面的场景则会使用if...else 或者 switch ... case
//如果需增加购车方式(或者BuyType改变)则会修改下面代码
//不符合开闭原则(即对扩展开放,对修改关闭)
if (BuyType = )
Console.WriteLine("我是土豪,全款买");
else if (BuyType = )
Console.WriteLine("5成首付,5成贷款");
else if (BuyType = )
Console.WriteLine("0首付,全贷款 ");

四、应用场景(引用百科)  

  1、 多个类只区别在表现行为不同,可以使用策略模式,在运行时动态选择具体要执行的行为。

  2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。  

  3、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。

最新文章

  1. yaf在windows7下32位的安装教程
  2. hdu 1850 Being a Good Boy in Spring Festival(Nimm Game)
  3. Python list去重及找出,统计重复项
  4. JQuery中如何click中传递参数
  5. [总结]FFMPEG视音频编解码零基础学习方法
  6. (转)swfobject.js 详细解说
  7. Yii2 框架下bootstrap 弹窗预览视频等~
  8. js技巧之this,call,apply
  9. LeetCode - 492. Construct the Rectangle
  10. 使用react全家桶制作博客后台管理系统
  11. JS变量声明方式
  12. tomcat运行超时问题解决
  13. 为什么IIS的应用池回收设置默认为1740分钟-20180720
  14. JavaScript Math对象方法
  15. php实现支付宝授权登录
  16. 解决sublime install package连不上的问题
  17. 2017 Multi-University Training Contest - Team 7
  18. im-switch -s ibus错误:Error: no configuration file "ibus" exists.
  19. flume将数据发送到kafka、hdfs、hive、http、netcat等模式的使用总结
  20. 2016.8.17服务器端数据库用户导入导出方法 expdp和impdp

热门文章

  1. obstacle
  2. Island Transport
  3. Linux找不到动态库
  4. 阈值分割与XLD轮廓拼接——第4讲
  5. 766A Mahmoud and Longest Uncommon Subsequence
  6. Netty 零拷贝(三)Netty 对零拷贝的改进
  7. javascript札记
  8. java中配置自定义拦截器中exclude-mapping path是什么意思?
  9. 2018.10.12 NOIP模拟 数据结构(线段树)
  10. 2018.07.08 POJ 2481 Cows(线段树)