张德长

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

设计模式之策略模式的实现

策略模式通用UML类图 with StarUML

具体实现的UML类图 with StarUML

折扣接口

namespace StrategyPattern
{
interface Discount
{
double Calculate(double price);
}
}

学生折扣类

namespace StrategyPattern
{
internal class StudentDiscount:Discount
{
private const double DISCOUNT = 0.8;
public double Calculate(double price)
{
Console.WriteLine("学生票:");
return price * DISCOUNT;
}
}
}

儿童折扣类

namespace StrategyPattern
{
internal class ChildrenDiscount : Discount
{
private const double DISCOUNT = 10;
public double Calculate(double price)
{
Console.WriteLine("儿童票:");
return price - DISCOUNT;
}
}
}

VIP折扣类

namespace StrategyPattern
{
internal class VIPDiscount : Discount
{
private const double DISCOUNT = 0.5;
public double Calculate(double price)
{
Console.WriteLine("VIP票:");
Console.WriteLine("增加积分!");
return price * DISCOUNT;
}
}
}

电影票类

namespace StrategyPattern
{
internal class MovieTicket
{
private double price;
private Discount discount;
public void SetDiscount(Discount discount)
{
this.discount = discount;
}
public double Price
{
get { return discount.Calculate(this.price); }
set { price = value; }
}
}
}

XML配置文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="discountType" value="StrategyPattern.ChildrenDiscount"/>
</appSettings>
</configuration>

 

测试代码

namespace StrategyPattern
{
internal class Program
{
static void Main(string[] args)
{
MovieTicket mt = new MovieTicket();
double originalPrice = 60;
double currentPrice;
mt.Price = originalPrice;
Console.WriteLine($"原始价为:{originalPrice}");
Console.WriteLine("---------------------------------");
Discount discount;
string discountType = ConfigurationManager.AppSettings["discountType"];
discount = (Discount)Assembly.Load("StrategyPattern").CreateInstance(discountType);
mt.SetDiscount(discount);
currentPrice = mt.Price;
Console.WriteLine($"折后价为:{currentPrice}");
Console.Read();
}
}
}

执行结果

posted on   张德长  阅读(127)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示