设计模式——策略模式

242 阅读1分钟

还记得面向对象的三大特性吗?封装、继承、多态,策略模式是多态很好的体现。

策略模式的应用

曾几何时,在老东家(不能告诉你们)做代码搬运工时,曾两次应用过策略模式。

其一,销售体系中,客户分为不同类型,卖给客户商品的价格也是不同的,根据不同客户类型,决定客户购买商品价格。

其二,营销体系中,商家搞的活动,满减、满折、满赠、返利等各种优惠,通过客户满足的不同优惠活动,计算客户最终购买商品的实际价格。

策略模式的代码示例

// 策略接口
public interface Strategy {
    double discountPrice(double money);
}
// 正常价格
public class StrategyNormal implement Strategy {
    @Override
    public double discountPrice(double money) {
        return money;
    }
}
// 满减价格
public class StrategyReduce implement Strategy {
    private double target;
    private double reduce;
    public StrategyReduce(double target, double reduce) {
        Assert.isTrue(target >= reduce, "目标金额不能小于优惠金额");
        this.target = target;
        this.reduce = reduce;
    }
    @Override
    public double discountPrice(double money) {
        return (money >= target) ? (money - reduce) : money;
    }
}
// 满折价格
public class StrategyDiscount implement Strategy {
    private double target;
    private double discount;
    public StrategyDiscount(double target, double discount) {
        Assert.isTrue(discount >= 0 && discount <=1, "折扣比例超出范围");
        this.target = target;
        this.discount = discount;
    }
    @Override
    public double discountPrice(double money) {
        return (money >= target) ? (money * discount) : money;
    }
}
// 聚合策略
public class Context {
    private Strategy strategy;
    public Context(Strategy strategy) {
        this.strategy = strategy;
    }
    public double finalPrice(double money) {
        return strategy.discountPrice(money);
    }
}
// main方法
public static void main(String[] args) {
    Context context = null;
    Scanner scanner = new Scanner(System.in);
    System.out.println("请输入策略类型");
    int strategy = scanner.next();
    switch(strategy) {
        case 1:
            System.out.println("请输入目标金额");
            double target = scanner.next();
            System.out.println("请输入满减金额");
            double reduce = scanner.next();
            context = new Context(new StrategyReduce(target, reduce));
            break;
        case 2:
            System.out.println("请输入目标金额");
            double target = scanner.next();
            System.out.println("请输入满折金额");
            double discount = scanner.next();
            context = new Context(new StrategyDiscount(target, discount));
            break;
        default:
            System.out.println("请输入正确的策略类型1/2");
            break;
    }
    System.out.println("请输入商品金额");
    double money = scanner.next();
    double totalprice = context.finalPrice(money);
    System.out.println("商品最终金额" + totalprice);
}