一、 问题描述
- 请设计并实现一个收银软件,模拟超市中客户付费金额的计算过程。主要实现三种收费策略:
- (1)原价付费;(2)满X返Y,如满300返100;(3)打折,如打8折。
二、 完成如下题目要求
-
画出静态图
-
写出采用该设计模式的好处
上下文(Context)和具体策略(ConcreteStrategy)是松耦合关系。
因此上下文只知道它要使用某一个实现Strategy接口类的实例,但不需要知道具体是哪一个类。
策略模式满足“开-闭原则”。当增加新的具体策略时,不需要修改上下文类的代码,上下文就可以引用新的具体策略 的实例。
- 编写代码
import java.util.Scanner;
public class CashSuper {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
Context context;
double money;
System.out.println("请输入总价:");
money=scanner.nextDouble();
context=new Context(new CashNormal());
System.out.println("原价:"+context.contextInterface(money));
context=new Context(new CashRebate(0.8));
System.out.println("打折后:"+context.contextInterface(money));
context=new Context(new CashReturn(300,100));
System.out.println("满300反100:"+context.contextInterface(money));
}
}
public class Context {
Strategy strategy;
public Context(Strategy strategy){
this.strategy = strategy;
}
public double contextInterface(double money){
double result=strategy.AlgorithmInterface(money);
return result;
}
}
public abstract class Strategy {
public abstract double AlgorithmInterface(double price);
}
public class CashNormal extends Strategy {
@Override
public double AlgorithmInterface(double price) {
return price;
}
}
public class CashRebate extends Strategy{
private double discount=1;
public CashRebate() {
}
public CashRebate(double discount) {
super();
this.discount = discount;
}
@Override
public double AlgorithmInterface(double price) {
return price*discount;
}
}
public class CashReturn extends Strategy {
private double moneyCondition;
private double moneyReturn;
public CashReturn() {
}
public CashReturn(double moneyCondition, double moneyReturn) {
super();
this.moneyCondition = moneyCondition;
this.moneyReturn = moneyReturn;
}
@Override
public double AlgorithmInterface(double price) {
int temp=(int) (price/this.moneyCondition);
return price-temp*this.moneyReturn;
}
}