设计模式——策略模式

本文介绍了策略模式的概念及其在电商促销活动中的应用案例。策略模式通过定义算法族并封装它们,允许算法的变化不影响到算法的使用者。文章还探讨了策略模式如何减少代码中的条件判断语句,提高代码的可维护性和灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

策略模式

策略模式从表理解,必定是有很多中策略,但是具体采用哪一种策略,那就是策略模式需要解决的问题。

策略模式定义了算法家族、分别封装起来,让他们之间可以相互替换,此模式让算法的变化不会影响到使用算法的用户。

例如模电商平台基本每个月都在做活动,如返现、打折等,这些算法的变化不需要进行停服维护,而是事先将算法都是想了,只是需要到特定的时间才会将这种算法启用。

定义算法的抽象:

public interface IPromote {
    void doPromote();
}

事先将算法进行实现:

public class Cashback implements IPromote {
    @Override
    public void doPromote() {
        System.out.println("返现活动开启");
    }
}

public class Discount implements IPromote {
    @Override
    public void doPromote() {
        System.out.println("限时打折活动");
    }
}

将算法进行注册,便于以后执行算法启用:

public class PromoteOnlineController {
    private final static Map<String,IPromote> register = new HashMap<>();
    static{
        register.put("discount",new Discount());
        register.put("cashbacl",new Cashback());
    }

    public void setOnline(String promoteName){
        register.get(promoteName).doPromote();
    }
}

执行上线活动:

    public static void main(String[] args) {
        PromoteOnlineController controller = new PromoteOnlineController();
        controller.setOnline("cashbacl");
        controller.setOnline("discount");
    }
返现活动开启
限时打折活动

执行上线活动的接口做在后台管理系统中,方便将活动进行控制。

策略模式能够最大程度的解决重复层叠的if....else嵌套,使得代码更优雅,同时适用于需要再多种算法中选择一个或多个,而且算法将来还会进行复用的场景。

拓展

现在小程序或者web应用中,在支付的时候都可以选择支付方式,支持微信支付、支付宝支付、银联支付等,这中场景就很完美匹配了策略模式,不同的支付方式对应不同的支付算法,也会调用不同的支付接口,进行策略选择放在了也用选择上,这个案例进不贴了,给读者机会去实践。

总结

策略模式的优点:

策略模式符合开闭原则
避免使用多重条件语句,如if-else,switch-case,,使用策略模式可以提高算法的保密性和安全性。

策略模式的缺点:

客户端必须知道所有的策略,并且自行决定使用哪一个策略(但是系统可以提示和限制用户的选择)。
代码中会产生很多的策略类,增加维护难度

### Java策略模式的设计与实现 #### 策略模式简介 策略模式(Strategy Pattern),又称政策模式,是一种行为设计模式。此模式允许定义一系列算法,并将每一个算法封装起来,使它们可以互换使用[^2]。 #### 接口声明公共方法 为了实现策略模式,首先需要创建一个接口来声明所有支持版本的公共操作。例如,在处理不同类型的支付方式时,可以定义 `PaymentStrategy` 接口: ```java public interface PaymentStrategy { void pay(int amount); } ``` #### 创建具体策略类 接着,通过不同的类去实现这个接口中的方法,这些类代表具体的策略。比如信用卡支付和PayPal支付两种不同的付款方式: 对于信用卡支付: ```java public class CreditCardPayment implements PaymentStrategy { private String cardNumber; public CreditCardPayment(String cardNum){ this.cardNumber = cardNum; } @Override public void pay(int amount) { System.out.println(amount + " paid with credit/debit card"); } } ``` 而对于PayPal支付,则有另一个实现: ```java public class PayPalPayment implements PaymentStrategy { private String emailId; public PayPalPayment(String email){ this.emailId=email; } @Override public void pay(int amount) { System.out.println(amount + " paid using PayPal."); } } ``` 上述两个类实现了相同的接口并提供了各自特有的逻辑,这就是所谓的“具体策略”。 #### 上下文环境设置 最后一步是在上下文中利用这些策略对象。这里我们构建了一个购物车的例子,它接受任何实现了 `PaymentStrategy` 的实例作为参数来进行结账过程: ```java class ShoppingCart { private PaymentStrategy paymentMethod; // 构造函数注入依赖关系 public ShoppingCart(PaymentStrategy pm) { this.paymentMethod=pm; } public void checkout() { int totalAmount = calculateTotal(); paymentMethod.pay(totalAmount); } private int calculateTotal(){ // 计算总价... return 100; } } ``` 这样就完成了整个流程:客户端可以选择合适的支付手段传入到购物车内完成交易动作[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值