策略模式

一、 问题描述

  • 请设计并实现一个收银软件,模拟超市中客户付费金额的计算过程。主要实现三种收费策略:
  • (1)原价付费;(2)满X返Y,如满300返100;(3)打折,如打8折。

二、 完成如下题目要求

  1. 画出静态图
    在这里插入图片描述

  2. 写出采用该设计模式的好处

	上下文(Context)和具体策略(ConcreteStrategy)是松耦合关系。
	因此上下文只知道它要使用某一个实现Strategy接口类的实例,但不需要知道具体是哪一个类。
	策略模式满足“开-闭原则”。当增加新的具体策略时,不需要修改上下文类的代码,上下文就可以引用新的具体策略   的实例。
  1. 编写代码
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;
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值