问题描述
多个商品采用不同的销售打折策略进行销售;
分析
java面向对象的语言,具有封装多态继承,并且易复用,易操作的特性,因此可以动态的加入一个商品,或者动态的加入一种打折策略。传统的面向过程的方法考虑的是通过if的语句来判断当前是哪个商品,采用的哪种策略,但是如果事先没有想周全,在代码完成的第一版想要添加某些功能,就必须去更改底层的所有代码。
而java具有继承的特点,可以采用接口来实现,将商品的不同种类分为一个类,将打折的策略分为一个类,将商品的统一管理分为一个类(理解为超市)。
首先可以选择用一个接口去与商品对接,即
interface Discount{ //待重写商品接口
void fruitDiscount();
}
接着定义一个商品的打折策略的接口,即
interface DiscountStrategy{ //该接口用于接收打折的策略
void DisStrategy(Discount d);
}
然后再在总的管理多种商品的类中的创建这个接口,并采用传参的方式将商品种类对象upcasting到该引用。
public class Strategy {
Discount fruit;
Strategy(Discount fruit){
this.fruit = fruit;
}
// 要把打折这个方法写出来
public void discountStrategying(){
fruit.fruitDiscount();
}
}
接着再在每个商品的类中分别实现Discount接口的方法,用于指明该商品的打折策略,即
public class Apple implements Discount{
private int unitPrice;
private int weight;
private int totalPrice;
private DiscountStrategy appleDicountStrategy = null;
Apple(int unitPrice, int weight, DiscountStrategy Strategy){
this.unitPrice = unitPrice;
this.weight=weight;
appleDicountStrategy = Strategy;
}
public int getUnitPrice() {
return unitPrice;
}
public void setUnitPrice(int unitPrice) {
this.unitPrice = unitPrice;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public int getTotalPrice() {
return totalPrice;
}
public void setTotalPrice(int totalPrice) {
this.totalPrice = totalPrice;
}
@Override
public void fruitDiscount() {
appleDicountStrategy.DisStrategy(this);
}
}
然后再在打折策略的类中实现DiscountStrategy接口的方法,用于选择不同的打折策略,即
public class AppleDiscountStrategyOne implements DiscountStrategy {
@Override
public void DisStrategy(Discount d) {
Apple apple = (Apple) d;
System.out.println(apple.getUnitPrice());
System.out.println(apple.getWeight());
}
}
最终在main函数中实现
AppleDiscountStrategyOne appleone = new AppleDiscountStrategyOne(); //设置策略类
Apple applee = new Apple(3,10,appleone);
Strategy strategy = new Strategy(applee);
strategy.discountStrategying();