18策略与模板方法模式的代码实现

策略模式(Strategy Pattern)

  • 使用策略模式设计影院售票系统的打折方案。

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

  1. 类图:

  1. 源代码:
  • Discount
package com.fish.pattern.strategy;  
  
public interface Discount {  
    double calculate(double price);  
}
  • MovieTicket
package com.fish.pattern.strategy;  
  
public class MovieTicket {  
    private double price;  
    private Discount discount;  
  
    public double getPrice() {  
        return discount.calculate(this.price);  
    }  
  
    public void setPrice(double price) {  
        this.price = price;  
    }  
  
    public void setDiscount(Discount discount) {  
        this.discount = discount;  
    }  
}
  • ChildrenDiscount
package com.fish.pattern.strategy;  
  
public class ChildrenDiscount implements Discount{  
    @Override  
    public double calculate(double price) {  
        System.out.println("儿童票");  
        if (price>20){  
            return price - 10;  
        }else{  
            return price;  
        }  
    }  
}
  • StudentDiscount
package com.fish.pattern.strategy;  
  
public class StudentDiscount implements Discount{  
    @Override  
    public double calculate(double price) {  
        System.out.println("学生票");  
        return 0.8*price;  
    }  
}
  • VIPDiscount
package com.fish.pattern.strategy;  
  
public class VIPDiscount implements Discount{  
    @Override  
    public double calculate(double price) {  
        System.out.println("VIP票:");  
        System.out.println("增加积分!");  
        return price*0.5;  
    }  
}
  • Client
package com.fish.pattern.strategy;  
  
public class Client {  
    public static void main(String[] args) {  
        MovieTicket ticket = new MovieTicket();  
        ticket.setPrice(40.0);  
        System.out.println("原票价为40.0元!");  
  
        ticket.setDiscount(new StudentDiscount());  
        System.out.println("当前的票价是:"+ticket.getPrice());  
  
        ticket.setDiscount(new VIPDiscount());  
        System.out.println("当前的票价是:"+ticket.getPrice());  
  
        ticket.setDiscount(new ChildrenDiscount());  
        System.out.println("当前的票价是:"+ticket.getPrice());  
    }  
}
  1. 运行结果:

模板方法模式

使用模板方法模式设计利息计算模块。
某软件公司要为某银行的业务支撑系统开发一个利息计算模块,利息的计算流程如下:
(1) 系统根据账号和密码验证用户信息,如果用户信息错误,则系统显示出错提示。
(2) 如果用户信息正确,则根据用户类型的不同使用不同的利息计算公式计算利息(如活期账户和定期账户具有不同的利息计算公式)。
(3) 系统显示利息。
现使用模板方法模式设计该利息计算模块。

  1. 类图:

  1. 源代码:
  • Account
package com.fish.pattern.templateMethod;  
  
//抽象类  
public abstract class Account {  
    protected String account;  
    protected String password;  
    protected double capital;  
  
    //基本方法--具体方法  
    public final boolean validate(String account,String password){  
        if (account.equalsIgnoreCase("admin") && password.equalsIgnoreCase("123456")) {  
            System.out.println("用户信息正确!");  
            return true;  
        }  
        else {  
            return false;  
        }  
    }  
  
    //基本方法--抽象方法  
    public abstract void calculateInterest();  
  
    //基本方法--具体方法(hook)  
    public void display(){  
        System.out.println("显示利息!");  
    }  
  
    //模板方法  
    public final void handle(String account,String password){  
        if (!validate(account,password)) {  
            System.out.println("账户或密码错误!");  
            return;  
        }  
        calculateInterest();  
        display();  
    }  
}
  • CurrentAccount
package com.fish.pattern.templateMethod;  
  
//活期账户类:具体子类  
public class CurrentAccount extends Account{  
    //覆盖父类的抽象基本方法  
    @Override  
    public void calculateInterest() {  
        System.out.println("按活期利率计算利息!");  
    }  
}
  • SavingAccount
package com.fish.pattern.templateMethod;  
  
//定期账户类:具体子类  
public class SavingAccount extends Account{  
    //覆盖父类的抽象基本方法  
    @Override  
    public void calculateInterest() {  
        System.out.println("按定期利率计算利息!");  
    }  
}
  • Client
package com.fish.pattern.templateMethod;  
  
public class Client {  
    public static void main(String[] args) {  
        Account currentAccount = new CurrentAccount();  
        currentAccount.handle("admin","123456");  
        System.out.println();  
        Account savingAccount = new SavingAccount();  
        savingAccount.handle("admin","123456");  
    }  
}
  1. 运行结果:

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