zoukankan      html  css  js  c++  java
  • asp.net—策略模式

    一、什么是策略模式

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

    二、怎么使用策略模式

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

      (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 = 1)
         Console.WriteLine("我是土豪,全款买");
     else if (BuyType = 2)
         Console.WriteLine("5成首付,5成贷款");
     else if (BuyType = 3)
         Console.WriteLine("0首付,全贷款   ");

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

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

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

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

  • 相关阅读:
    二进制兼容
    non-fragile:oc2.0特性--继承结构的父类内存布局变化时子类是否需要重新编译的问题
    [objc explain]: Non-fragile ivars
    函数响应式编程(FRP)思想-Callback风格
    FRP-Functional Reactive Programming-函数响应式编程
    AWESOME SWIFT-swift.libhunt.com-swift类库网站
    iOS
    视图逻辑、应用逻辑、业务逻辑
    laravel微信自定义分享
    实现手机网页调起原生微信朋友圈分享的工具nativeShare.js
  • 原文地址:https://www.cnblogs.com/witeem/p/10177982.html
Copyright © 2011-2022 走看看