第一篇博客
本文来自 自己老师 的博客 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