第一篇博客
本文来自 自己老师 的博客 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打折 则在配置文件中修改
这是我的第一篇文章,说实话没什么技术含量,写的也很烂。。。。,设计模式挺重要的,所以现在复习下,马上毕业了,希望能有个好的开始,
来源:https://www.cnblogs.com/StoneSH/archive/2013/04/04/2999422.html