策略模式+简单工厂模式

如果要设计一个商场收银系统,同时具备原价、打8折、满300减100的优惠,如何设计?

简单工厂模式

使用简单工厂模式确实可以比较优美地解决当下问题。

// 工厂类
public class CashFactory {
    public Cash getRealCash(String keyword) {
        switch (keyword) {
            case "原价":
                return new CashNormal();
            case "8折":
                return new CashRebate();
            case "满300减100":
                return new CashReturn();
        }
        return new Cash();
    }
}
// 促销类
abstract class Strategy {
    public abstract double getCash(double cash);
}

class StrategyA extends Strategy {
    @Override
    public double getCash(double cash) {
        System.out.println("StrategyA");
        return cash;
    }
}

class StrategyB extends Strategy {
    @Override
    public double getCash(double cash) {
        System.out.println("StrategyB");
        return cash * 0.8;
    }
}

class StrategyC extends Strategy {
    @Override
    public double getCash(double cash) {
        System.out.println("StrategyC");
        int rebate = (int) (cash / 300) * 100;
        return cash - rebate;
    }
}

但是未来若商场的促销活动更新,如推出七折、满500减200等活动,还是要重写、重新编译促销类中的代码,违背了可维护性、灵活性也差。

策略模式

策略模式:定义算法家族,将其分别封装起来,让它们之间能相互替换;而其算法的变化不会影响到客户。

建立一个上下文类,承接客户端传来的选择营销策略的数据,调用对应策略接口,输出值。

其UML图如下所示:
在这里插入图片描述

  • 策略类:定义所有支持的算法的公共接口
  • 上下文类:用一个具体策略类来配置,维护一个对策略类的引用
  • 具体策略类:封装了具体的算法或行为

代码实现如下:

// 上下文类
public class Context {
    Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    public double getResult(double cash) {
        return strategy.getCash(cash);
    }
}
// 客户端类
public class Demo {
    public static void main(String stra, double cash) {
        double res;
        switch (stra) {
            case "正常收费":
                res = new Context(new StrategyA()).getResult(cash);
                System.out.println(res);
                break;
            case "8折":
                res = new Context(new StrategyB()).getResult(cash);
                System.out.println(res);
                break;
            case "满300减100":
                res = new Context(new StrategyC()).getResult(cash);
                System.out.println(res);
                break;
        }
    }
}

可发现客户端类承受了太多,若需简化客户端,则将简单工厂模式与策略模式结合,如下。

策略模式与简单工厂模式结合

// 上下文类
public class Context {
    Strategy strategy;

    public Context(String strategy) {
        switch (strategy) {
            case "正常收费":
                this.strategy = new StrategyA();
                break;
            case "8折":
                this.strategy = new StrategyB();
                break;
            case "满300减100":
                this.strategy = new StrategyC();
                break;
        }
    }

    public double getResult(double cash) {
        return strategy.getCash(cash);
    }
}
// 客户端类
public class Demo {
    public static void main(String stra, double cash) {
        Context context = new Context("8折");
        double res = context.getResult(cash);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Boot中使用策略模式和依赖注入可以通过以下步骤实现: 1. 创建策略接口和多个实现类,例如: ```java public interface PaymentStrategy { void pay(double amount); } @Component public class CreditCardPaymentStrategy implements PaymentStrategy { @Override public void pay(double amount) { System.out.println("Paid " + amount + " using credit card."); } } @Component public class PayPalPaymentStrategy implements PaymentStrategy { @Override public void pay(double amount) { System.out.println("Paid " + amount + " using PayPal."); } } ``` 2. 创建一个策略工厂类,用于根据不同的条件返回不同的策略实现类,例如: ```java @Component public class PaymentStrategyFactory { private final CreditCardPaymentStrategy creditCardPaymentStrategy; private final PayPalPaymentStrategy payPalPaymentStrategy; @Autowired public PaymentStrategyFactory(CreditCardPaymentStrategy creditCardPaymentStrategy, PayPalPaymentStrategy payPalPaymentStrategy) { this.creditCardPaymentStrategy = creditCardPaymentStrategy; this.payPalPaymentStrategy = payPalPaymentStrategy; } public PaymentStrategy getPaymentStrategy(String paymentMethod) { if ("creditCard".equalsIgnoreCase(paymentMethod)) { return creditCardPaymentStrategy; } else if ("payPal".equalsIgnoreCase(paymentMethod)) { return payPalPaymentStrategy; } else { throw new IllegalArgumentException("Invalid payment method: " + paymentMethod); } } } ``` 3. 在需要使用策略的地方,注入策略工厂,并根据条件获取对应的策略实现类,例如: ```java @RestController public class PaymentController { private final PaymentStrategyFactory paymentStrategyFactory; @Autowired public PaymentController(PaymentStrategyFactory paymentStrategyFactory) { this.paymentStrategyFactory = paymentStrategyFactory; } @PostMapping("/pay") public void pay(@RequestParam String paymentMethod, @RequestParam double amount) { PaymentStrategy paymentStrategy = paymentStrategyFactory.getPaymentStrategy(paymentMethod); paymentStrategy.pay(amount); } } ``` 在上述代码中,我们使用了Spring Boot的依赖注入功能,将策略实现类注入到策略工厂中,并将策略工厂注入到控制器中。在控制器中,我们根据请求参数获取对应的策略实现类,并调用其方法完成支付操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值