zoukankan      html  css  js  c++  java
  • 设计模式学习 之 策略模式

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

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

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

    一种策略算法。

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

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

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

  • 相关阅读:
    AcWing 第 12 场周赛
    AtCoder Beginner Contest 170 (D~F题,D筛法,E multiset使用,F Dijkstra算法改进)
    Codeforces Round #650 (Div. 3) F1经典离散化DP
    Codeforces Round #738 (Div. 2) (A~E)
    AtCoder Beginner Contest 214 (D并查集,E反悔贪心,F公共子序列DP)
    c++ 跨平台线程同步对象那些事儿——基于 ace
    博客园排名预测
    关于netty
    全局获取HttpContext
    【设计模式】设计模式学习笔记之(一)——类图、对象之间的关系及设计模式概要
  • 原文地址:https://www.cnblogs.com/lfyy/p/5087120.html
Copyright © 2011-2022 走看看