策略模式实验
一、行为型模式的原理
行为型模式(Behavioral Pattern) 关注系统中对象之间的交互,研究系统在运行时对象之间的相互通信与协作,进一步明确对象的职责行为型模式,不仅仅关注类和对象本身,还重点关注它们之间的相互作用和职责划分
二、实验内容
某电影院开发了一套影院售票系统,在该系统中需要为不同类型的用户提供不同的电影票打折方式,具体打折方案如下:
(1) 学生凭学生证可享受票价8折优惠。
(2) 年龄在10周岁及以下的儿童可享受每张票减免10元的优惠(原始票价需大于等于20元)。
(3) 影院VIP用户除享受票价半价优惠外还可进行积分,积分累计到一定额度可换取电影院赠送的奖品。
该系统在将来可能还要根据需要引入新的打折方式。现使用策略模式绘制类图设计该影院售票系统的打折方案。
[实验步骤]
(1) 分析案例,采用策略模式设计类图,确定策略模式的角色。
(2) 分析确定类图。
三、分析角色
- 环境(Context) - MovieTicket
- 特点:在类图中,
MovieTicket
类包含了discount
(折扣类型)和price
(票价)属性,以及getprice()
(获取票价)、setDiscount(Discount)
(设置折扣类型)和setPrice(double)
(设置票价)方法。 - 作用:
MovieTicket
类是策略模式中的环境类,它持有一个Discount
接口的引用,通过调用Discount
接口的calculateDiscount(double)
方法来计算实际票价,即根据不同的折扣策略来确定最终的票价。 - 抽象策略(Strategy) - Discount
- 特点:
Discount
是一个接口,它定义了calculateDiscount(double)
方法。 - 作用:这个接口是所有具体折扣策略类的共同接口,规定了计算折扣的方法。它使得不同的折扣策略类可以互换使用,体现了策略模式的核心思想。
- 具体策略(Concrete Strategy) - StudentDiscount、VIPDiscount、ChildrenDiscount
- 特点:
StudentDiscount
类实现了Discount
接口,它的calculateDiscount(double)
方法实现了学生票价 8 折优惠的逻辑。VIPDiscount
类实现了Discount
接口,它的calculateDiscount(double)
方法实现了 VIP 用户票价半价优惠的逻辑。ChildrenDiscount
类实现了Discount
接口,它的calculateDiscount(double)
方法实现了 10 周岁及以下儿童减免 10 元(原始票价需大于等于 20 元)的逻辑。
- 作用:这些具体策略类分别实现了不同类型用户的电影票打折方案,通过实现
Discount
接口的calculateDiscount(double)
方法来提供具体的折扣计算逻辑。
通过策略模式的设计,电影院售票系统可以方便地根据不同用户类型应用不同的折扣策略,并且在未来需要引入新的打折方式时,只需要添加新的具体策略类并实现Discount
接口即可,无需修改MovieTicket
类的核心逻辑,提高了系统的可扩展性和维护性。
实现结果
画出的UML如下图所示:
MovieTicket.java
public class MovieTicket {
private Discount discount;
private double price;
public Discount m_Discount;
public MovieTicket(){
}
public double getPrice(){
return this.price;
}
public void setDiscount(Discount discount){
this.discount = discount;
}
public void setPrice(double price){
this.price = price;
}
}
Discount.java(接口)
public interface Discount {
public double calculateDiscount(double price);
}
ChildrenDiscount.java
public class ChildrenDiscount implements Discount {
public ChildrenDiscount() {
}
public double calculateDiscount(double price) {
System.out.println("儿童票");
if (price > 20) {
price = price - 10;
return price;
}else {
return price;
}
}
}
StudentDiscount.java
public class StudentDiscount implements Discount {
public StudentDiscount(){
}
public double calculateDiscount(double price){
System.out.println("学生票");
return price * 0.8;
}
}
VIPDiscount.java
public class VIPDiscount implements Discount {
public VIPDiscount() {
}
public double calculateDiscount(double price) {
System.out.println("会员票");
System.out.println("积分增加+" + price * 0.5);
return price * 0.5;
}
}
Client.java
public class Client {
public static void main(String[] args) {
MovieTicket movieTicket = new MovieTicket();
double Price = 60;
double currentPrice;
movieTicket.setPrice(Price);
System.out.println("原始票价:" + Price);
Discount discount = new StudentDiscount();
movieTicket.setDiscount(discount);
currentPrice = discount.calculateDiscount(movieTicket.getPrice());
System.out.println("折后价为:" + currentPrice);
}
}
评论区