策略模式 极其简单的列子

Deadly 提交于 2020-03-19 00:15:59

第一篇博客

本文来自 自己老师 的博客 http://blog.csdn.net/lovelion/article/details/7818983

题目:某软件公司为某电影院开发了一套影院售票系统,在该系统中需要为不同类型的用户提供不同的电影票打折方式,具体打折方案如下:

      (1) 学生凭学生证可享受票价8折优惠;

      (2) 年龄在10周岁及以下的儿童可享受每张票减免10元的优惠(原始票价需大于等于20元);

      (3) 影院VIP用户除享受票价半价优惠外还可进行积分,积分累计到一定额度可换取电影院赠送的奖品。

      该系统在将来可能还要根据需要引入新的打折方式

1.要满足开闭原则 二话不说先定义抽象类或接口

namespace StrategyTest
{
    /// <summary>
    /// 抽象策略类  (折扣类)
    /// </summary>
  public  interface IAbsStrategy
    {
      /// <summary>
      /// 打折 抽象方法(用拼音。。)
      /// </summary>
      /// <param name="price">价格</param>
      /// <returns>double</returns>
      double DaZhe(double price);
    }
}

2.年龄在十岁以下-10元

namespace StrategyTest
{
  public class ChildrenDaZhe:IAbsStrategy
    {
      /// <summary>
      /// 儿童减10元
      /// </summary>
      /// <param name="price"></param>
      /// <returns></returns>
        public double DaZhe(double price)
        {
            Console.Write("儿童价:");
            return price - 10;
        }
    }
}

3.学生打八折

namespace StrategyTest
{
 public  class StudentDaZhe:IAbsStrategy
    {
     /// <summary>
     /// 学生8折
     /// </summary>
     /// <param name="price"></param>
     /// <returns></returns>
        public double DaZhe(double price)
        {
            Console.Write("学生价:");
            return price * 0.8;
        }
    }
}


4.VIP打5折

namespace StrategyTest
{
   public class VIPDaZhe:IAbsStrategy
    {
       /// <summary>
       /// VIP打5折 积分增加
       /// </summary>
       /// <param name="price"></param>
       /// <returns></returns>
        public double DaZhe(double price)
        {
            Console.Write("VIP价格:");
            Console.Write("积分增加 +1  \r\n");//积分这里意思一下。。。
            return price * 0.5;
        }
    }
}

 

namespace StrategyTest
{
    /// <summary>
    /// 电影票 环境类
    /// 提供两个注入方法(注入为抽象类) 1.构造函数注入 2.方法注入
    /// </summary>
  public class MovieTicket
    {
      private IAbsStrategy abs;//抽象打折
      private double price;//价格
      public MovieTicket()
      {

      }
      //构造注入
      public MovieTicket(IAbsStrategy abs)
      {
          this.abs = abs;
      }
      public double Price
      {
          get { return price; }
          set { price = value; }
      }
      //方法注入
      public void SetStrategy(IAbsStrategy myAbs)
      {
          this.abs = myAbs;
      }
      /// <summary>
      /// 获取打折后的价格
      /// </summary>
      /// <returns></returns>
      public double GetPrice()
      {
          return abs.DaZhe(price);
      }
    }
}

 

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="Srtiategy" value="StrategyTest.ChildrenDaZhe"></add>
  </appSettings>
</configuration>

 

 

namespace StrategyTest
{
    class Program
    {
        static void Main(string[] args)
        {
            string txt = ConfigurationManager.AppSettings["Srtiategy"].ToString();//读取配置文件
            IAbsStrategy abs = Assembly.Load("StrategyTest").CreateInstance(txt) as IAbsStrategy;//创建实例

            MovieTicket move = new MovieTicket(abs);//电影票类 环境类(构造注入)
            move.Price = 30;//设置原始价格

            //move.SetStrategy(abs);//方法注入

           double myPrice= move.GetPrice();//获取价格
           Console.Write("原始价为:"+move.Price);
           Console.Write("打完折为:" + myPrice);
            Console.Read();
        }
    }
}

结果: 儿童价: 原始价为:30打完折为:20

如果需要修改为VIP打折  则在配置文件中修改

这是我的第一篇文章,说实话没什么技术含量,写的也很烂。。。。,设计模式挺重要的,所以现在复习下,马上毕业了,希望能有个好的开始,

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!