• 设计模式学习 之 策略模式


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

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

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

    一种策略算法。

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

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

     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    当你在一个访问性比较强(例如公共)的字段/属性/方法里使用自定义类型,而这个类型访问性比较低(例如保护/私有)的时候就发生这个问题了

  • 相关阅读:
    iOS NSString中的搜索方法rangeOfString
    iOS 远程推送通知
    iOS PushMeBaby日志提示SSLwrite():-36 94
    iOS [[NSBundle mainBundle] pathForResource:@"" ofType:@""]无法获取到文件
    iOS 申请测试用的远程推送证书
    数据结构与算法学习笔记(五)
    iOS 上传新版本到AppStore时报错ITMS-90034
    数据结构与算法学习笔记(四)
    数据结构与算法学习笔记(三)
    iOS开发日记49-详解定位CLLocation
  • 原文地址:https://www.cnblogs.com/lfyy/p/5087120.html
Copyright © 2020-2023  润新知