18策略与模板方法模式的代码实现
策略模式(Strategy Pattern)
- 使用策略模式设计影院售票系统的打折方案。
某软件公司为某电影院开发了一套影院售票系统,在该系统中需要为不同类型的用户提供不同的电影票打折方式,具体打折方案如下:
(1) 学生凭学生证可享受票价8折优惠。
(2) 年龄在10周岁及以下的儿童可享受每张票减免10元的优惠(原始票价需大于等于20元)。
(3) 影院VIP用户除享受票价半价优惠外还可进行积分,积分累计到一定额度可换取电影院赠送的奖品。
该系统在将来可能还要根据需要引入新的打折方式。现使用策略模式设计该影院售票系统的打折方案。
- 类图:
- 源代码:
- 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) 系统根据账号和密码验证用户信息,如果用户信息错误,则系统显示出错提示。
(2) 如果用户信息正确,则根据用户类型的不同使用不同的利息计算公式计算利息(如活期账户和定期账户具有不同的利息计算公式)。
(3) 系统显示利息。
现使用模板方法模式设计该利息计算模块。
- 类图:
- 源代码:
- 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");
}
}
- 运行结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律