设计模式学习 之 策略模式

策略模式的定义:定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。独立于它的客户端 可以根据 自身选择 其中一种算法。

举些常用的 例子: 你去 旅行  ,完成这一事件 可能有 不同的交通工具的 选择 ,汽车,火车,飞机 都可以 看成 策略模式中的 一种算法 ,商场 活动 打折 ,针对 不同的 会员

等级 会有 不同 等级的 折扣 活动。每种折扣,也可以看成 一种 算法。电商 网站 中 经常 会举行 不同的 活动,可能会有 红包 ,现金,代金券,积分 等优惠活动 这也可以看成

一种策略算法。

策略模式 优点 在于 :子算法 之间 可以自由切换,子算法 具有 相同的 功能, (平等性),但可以 有不同的 实现。这样 可以把 代码 公共部分 放在 父类中,减少重复代码。

缺点: 事先必须知道 策略模式  拥有的子算法,在 对象初始化时,已经 确定好了 要执行的 算法。 

 1 namespace Strategy
 2 {
 3 
 4     //活动 抽象类
 5    public  abstract class MyStrategy
 6     {
 7 
 8          //活动抽象方法
 9 
10          public abstract void ActivityInterface();
11 
12     }
13 }
View Code
namespace Strategy
{

    //红包活动
      public class ActivityContentHongbao :MyStrategy
    {

          public override void ActivityInterface()
          {

              Console.WriteLine("红包方式活动");

          }


    }

    // 积分活动
      public class ActivityContentJiFen : MyStrategy
      {

          public override void ActivityInterface()
          {
              Console.WriteLine("积分方式活动");
          }


      }


    //现金活动
      public class ActivityContentMoneny : MyStrategy
      {

          public override void ActivityInterface()
          {
              Console.WriteLine("现金方式活动");
          }


      }

    // 购物券活动
      public class ActivityContentCoupon : MyStrategy
      {

          public override void ActivityInterface()
          {
              Console.WriteLine("购物券方式活动");
          }


      }

  

namespace Strategy
{

    /// <summary>
    /// 环境类   让使用者决定使用哪种活动方式
    /// </summary>
    public class Context
    {

    public  MyStrategy strategy;

        public Context(MyStrategy strategy)
        {
            //初始化时 传入具体的对象 你所要 选择的 活动方式

            this.strategy = strategy;
        
        
        }


        //根据 你选择的策略 采用该策略 的具体 实现方法
        public void ActivitycontentInterface() {

            strategy.ActivityInterface();
        
        }




    }
}
View Code
public  class Program
    {
       public  static void Main(string[] args)
        {

            Context activity;

            activity = new Context(new ActivityContentMoneny());

            activity.ActivitycontentInterface();



            Console.Read();


        }

    }

  

遇到的问题:可访问性不一致 检查 有没有 方法 没有 用到 public    当你在一个访问性比较强(例如公共)的字段/属性/方法里使用自定义类型,而这个类型访问性比较低(例如保护/私有)的时候就发生这个问题了

原文地址:https://www.cnblogs.com/lfyy/p/5087120.html