设计模式之策略模式:让你的代码灵活应对不同的算法

这篇具有很好参考价值的文章主要介绍了设计模式之策略模式:让你的代码灵活应对不同的算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

作为一个程序员,我们经常会面临着在不同的情况下选择不同的算法来解决问题的需求。这种情况下,策略模式是一个非常有用的设计模式。在本文中,我将向你介绍策略模式的概念、结构以及如何应用这个模式来使你的代码更灵活。

1.什么是策略模式?

策略模式是一种行为型设计模式,它允许在运行时根据不同的情况选择算法的行为。这意味着我们可以将不同的算法封装成不同的策略类,并通过一个统一的接口来调用这些策略。

2.策略模式的结构

策略模式包括以下几个角色:

上下文(Context):持有一个策略对象的引用,并在需要时调用策略对象的方法。上下文可以根据具体情况选择不同的策略。

策略(Strategy):定义了一个公共接口,用于封装不同的算法。这个接口通常只有一个方法,即执行算法的方法。

具体策略(ConcreteStrategy):实现了策略接口,提供具体的算法实现。每个具体策略类都代表了一种特定的算法。

策略模式的关键在于上下文持有一个策略对象的引用,并且通过调用策略对象的方法来执行具体的算法。这种方式使得上下文变得非常灵活,可以根据不同的需求在运行时切换算法。

3.策略模式的应用场景

策略模式适用于以下情况:

  • 当需要在运行时动态地选择算法实现时,可以使用策略模式。
  • 当一个类有多个行为变种,并且这些行为可以灵活地切换时,策略模式可以提供一种优雅的解决方案。

例子(1)例如,在一个电商网站中,我们可能需要根据不同的支付方式来支付购物车的商品。可以是信用卡,当然也可以是京东支付、支付宝支付等等,这时,我们可以将每种支付行为封装成一个具体策略类,然后通过上下文选择合适的支付方式进行支付。

也许你可能见过类似的代码

if(payType==CreditCardType){
     System.out.println("使用信用卡支付:" + amount + " 元"); 
     // 实现具体的信用卡支付逻辑
}else if(payType==jdPayType){
     System.out.println("使用京东支付:" + amount + " 元"); 
     // 实现具体的京东支付逻辑
}else if(payType==alipayType){
    System.out.println("使用支付宝支付:" + amount + " 元"); 
    // 实现具体的支付宝支付逻辑 
}else{
    System.out.println("没实现,白嫖叭"); 
}

好了,这时候微信一看,为啥没把微信支付加上,赶紧支持。研发小哥哥加班修改逻辑如下:

if(payType==creditCardType){
     System.out.println("使用信用卡支付:" + amount + " 元"); 
     // 实现具体的信用卡支付逻辑
}else if(payType==jdPayType){
     System.out.println("使用京东支付:" + amount + " 元"); 
     // 实现具体的京东支付逻辑
}else if(payType==alipayType){
    System.out.println("使用支付宝支付:" + amount + " 元"); 
    // 实现具体的支付宝支付逻辑 
}else if(payType==wxPayType){ 
    System.out.println("使用微信支付:" + amount + " 元"); 
    // 实现具体的微信支付逻辑 
}else{
    System.out.println("没实现,白嫖叭"); 
}

代码修改后,看着挺清晰明了,但是有一个问题,如果之后还有其他如抖音支付、乱七八糟支付的话我们就要一直修改这个类,一直添加 ...else if...

很明显违背了面向对象设计的六大原则之二:单一职责、开闭原则(对扩展开放、对修改关闭),六个违背俩,这活没法干了!

下面演示了如何使用策略模式来实现不同的支付方式:

// 定义一个支付的策略接口
public interface PaymentStrategy {
    //这只是个测试场景,真实场景下应该没人用double类型叭
    void pay(double amount);
}

// 具体策略实现
// 信用卡支付
public class CreditCardPaymentStrategy implements PaymentStrategy {
    public void pay(double amount) {
        System.out.println("使用信用卡支付:" + amount + " 元");
        // 实现具体的信用卡支付逻辑
    }
}
// 京东支付
public class JdPaymentStrategy implements PaymentStrategy {
    public void pay(double amount) {
       System.out.println("使用京东支付:" + amount + " 元"); 
       // 实现具体的京东支付逻辑
    }
}
//省略...
// 支付宝支付
// 微信支付


// 上下文
public class ShoppingCart {
    private PaymentStrategy paymentStrategy;

    public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }

    public void checkout(double amount) {
        // 调用策略对象的支付方法
        paymentStrategy.pay(amount);
    }
}

// 使用示例
public class Main {
    public static void main(String[] args) {
        ShoppingCart cart = new ShoppingCart();
        
        // 设置使用信用卡支付策略
        cart.setPaymentStrategy(new CreditCardPaymentStrategy());
        cart.checkout(1000.00);

        // 设置使用jd支付策略
        cart.setPaymentStrategy(new JdPaymentStrategy());
        cart.checkout(2000.00);
        //如果还想用其他支付 就继续写啊
       
    }
}


在上面的例子中,PaymentStrategy是策略接口,CreditCardPaymentStrategy和PayPalPaymentStrategy是具体的策略实现。ShoppingCart是上下文,通过setPaymentStrategy方法来设置不同的支付策略,并通过checkout方法调用具体策略的支付方法。看看,是不是可以通过扩展来增加支付方式。每个子类只实现具体的某种支付的策略。

例子(2)实现一个简单的计算器(整数),简单想一想也许涉及以下几种计算方式:加减乘除,也许有人会这样实现,但是我想一定不是你,聪明的你应该已经学会了策略模式在这种场景下的应用

试想 如果我想增加取余操作呢?


int num1 = 10;
int num2 = 5;
String operator = "+";

if (operator.equals("+")) {
    int result = num1 + num2;
    System.out.println("加法结果:" + result);
} else if (operator.equals("-")) {
     int result = num1 - num2;
      System.out.println("减法结果:" + result);
} else if (operator.equals("*")) {
     int result = num1 * num2;
     System.out.println("乘法结果:" + result);
} else if (operator.equals("/")) {
     if (num2 != 0) {
          int result = num1 / num2;
          System.out.println("除法结果:" + result);
     } else {
          System.out.println("除数不能为零");
     }
 } else {
     System.out.println("无效的运算符");
 }



4.总结

策略模式是一种灵活、可扩展的设计模式,它通过将算法封装成策略类来实现不同的行为变种。使用策略模式可以提高代码的可维护性和复用性,同时也符合面向对象设计的原则。

希望本文的介绍对你理解策略模式有所帮助,也希望你能在实际项目中运用到这个强大的设计模式!

作者:京东零售 闫先东

来源:京东云开发者社区 转载请注明来源文章来源地址https://www.toymoban.com/news/detail-711076.html

到了这里,关于设计模式之策略模式:让你的代码灵活应对不同的算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式学习笔记 - 开源实战一(下):通过剖析JDK源码学习灵活应用设计模式

    上篇文章我们讲解了工厂模式、建造者模式、适配器模式适配器模式在 JDK 中的应用,其中 Calendar 类用到了工厂模式和建造者模式, Collections 类用到了装饰器模式和适配器模式。学习的重点是让你了解,在真实的项目中模式的实现和应用更加灵活、多变,会根据具体的场景做

    2024年04月28日
    浏览(38)
  • 设计模式之“接口隔离原则“:打破僵化,实现灵活编程

    在现代软件开发中,设计模式是解决常见问题的最佳实践。其中,接口隔离原则(Interface Segregation Principle,简称ISP)是面向对象设计模式中的重要原则之一。本文将深入解析接口隔离原则,帮助您理解其重要性,以及如何在实践中应用这一原则,提升代码的可维护性和可扩展

    2024年01月19日
    浏览(34)
  • 二十三种设计模式全面解析-装饰器模式的高级应用:打造灵活可扩展的通知系统

    在现代软件开发中,通知系统是一个广泛应用的功能,用于实时向用户发送各种类型的通知,如短信、微信、邮件以及系统通知。然而,通知系统的需求通常是多变且动态的,因此需要一种灵活可扩展的设计模式来满足不同类型的通知需求。 在前面一篇文章中,我们介绍了什

    2024年02月06日
    浏览(45)
  • 【设计模式与范式:行为型】62 | 职责链模式(上):如何实现可灵活扩展算法的敏感信息过滤框架?

    前几节课中,我们学习了模板模式、策略模式,今天,我们来学习职责链模式。这三种模式具有相同的作用:复用和扩展,在实际的项目开发中比较常用,特别是框架开发中,我们可以利用它们来提供框架的扩展点,能够让框架的使用者在不修改框架源码的情况下,基于扩展

    2024年02月10日
    浏览(43)
  • 二十三种设计模式全面解析-桥接模式的高级应用:构建灵活的跨平台UI框架

    在软件开发的世界中,桥接模式(Bridge Pattern)作为一种设计模式,旨在将抽象部分与实现部分分离,从而使它们可以独立地变化。这一模式的应用不仅有助于提高代码的可维护性,还在一些复杂的场景中展现出其真正的价值。 前面一篇文章中,我们介绍了什么是桥接模式?

    2024年02月05日
    浏览(45)
  • 【Vue】怎样让你的组件变得更灵活?

    在我们的日常开发中,我们一般会引入做的比较成熟的第三方UI框架,比如ElementUI。 当我们在调用UI框架中的组件时,会发现常用的调用方式有两种,一种是直接在页面中嵌入组件: 另一种则是在js中通过方法调用: 可以看到ElementUI中的组件使用方式更加灵活,可以满足不同

    2024年02月06日
    浏览(80)
  • [设计模式]行为型模式-策略模式

    策略模式定义了一系列算法,并将每个算法封装起来,使它们可以互相替换,且算法的变换不会影响使用算法的客户。 在项目开发中,我们经常要根据不同的场景,采取不同的措施,也就是不同的策略。假设我们需要对a、b这两个整数进行计算,根据条件的不同,需要执行不

    2024年02月19日
    浏览(44)
  • 设计模式之策略模式

    策略设计模式(Strategy Pattern)是一种行为设计模式,它允许在运行时选择算法的行为。策略模式定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。这种模式使算法的变化独立于使用算法的客户端。 概念 在策略模式中,有以下几个关键组成部分: 策略接口(

    2024年01月23日
    浏览(49)
  • 设计模式——策略模式

    定义: 该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把便用算法的责任和算法的实现分割开来,并委派给不算法进象行管理。 主要角色如下: 示例: 假定现在需要

    2024年02月22日
    浏览(36)
  • 设计模式-策略模式

    策略模式是一种行为型设计模式,它允许在运行时动态改变对象的行为。在策略模式中,算法被封装在独立的策略类中,使得它们可以互换使用。下面是一个简单的例子: 假设我们有一个计算税收的系统,现在需要计算不同类型的商品的税收,例如书籍、食品和服装。每种商

    2024年02月15日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包