目 录CONTENT

文章目录

Java-软件模式实验-策略模式

~梓
2024-12-25 / 0 评论 / 0 点赞 / 49 阅读 / 0 字
温馨提示:
本文最后更新于2024-12-25,若内容或图片失效,请留言反馈。 部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

策略模式实验

一、行为型模式的原理
行为型模式(Behavioral Pattern) 关注系统中对象之间的交互,研究系统在运行时对象之间的相互通信与协作,进一步明确对象的职责行为型模式,不仅仅关注类和对象本身,还重点关注它们之间的相互作用和职责划分

二、实验内容

某电影院开发了一套影院售票系统,在该系统中需要为不同类型的用户提供不同的电影票打折方式,具体打折方案如下:
(1) 学生凭学生证可享受票价8折优惠。
(2) 年龄在10周岁及以下的儿童可享受每张票减免10元的优惠(原始票价需大于等于20元)。
(3) 影院VIP用户除享受票价半价优惠外还可进行积分,积分累计到一定额度可换取电影院赠送的奖品。
该系统在将来可能还要根据需要引入新的打折方式。现使用策略模式绘制类图设计该影院售票系统的打折方案。
[实验步骤]
(1) 分析案例,采用策略模式设计类图,确定策略模式的角色。
(2) 分析确定类图。

三、分析角色

  1. 环境(Context) - MovieTicket
  2. 特点:在类图中,MovieTicket类包含了discount(折扣类型)和price(票价)属性,以及getprice()(获取票价)、setDiscount(Discount)(设置折扣类型)和setPrice(double)(设置票价)方法。
  3. 作用MovieTicket类是策略模式中的环境类,它持有一个Discount接口的引用,通过调用Discount接口的calculateDiscount(double)方法来计算实际票价,即根据不同的折扣策略来确定最终的票价。
  4. 抽象策略(Strategy) - Discount
  5. 特点Discount是一个接口,它定义了calculateDiscount(double)方法。
  6. 作用:这个接口是所有具体折扣策略类的共同接口,规定了计算折扣的方法。它使得不同的折扣策略类可以互换使用,体现了策略模式的核心思想。
  7. 具体策略(Concrete Strategy) - StudentDiscount、VIPDiscount、ChildrenDiscount
  8. 特点:
    • StudentDiscount类实现了Discount接口,它的calculateDiscount(double)方法实现了学生票价 8 折优惠的逻辑。
    • VIPDiscount类实现了Discount接口,它的calculateDiscount(double)方法实现了 VIP 用户票价半价优惠的逻辑。
    • ChildrenDiscount类实现了Discount接口,它的calculateDiscount(double)方法实现了 10 周岁及以下儿童减免 10 元(原始票价需大于等于 20 元)的逻辑。
  9. 作用:这些具体策略类分别实现了不同类型用户的电影票打折方案,通过实现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);
    }
}
0

评论区