(进阶修正篇)不需要策略模式也能避免满屏if/else

2023年 7月 12日 18.1k 0

接受批评

image.png

这是上一篇写的文章中,一些读者的评价,这里我向各位道歉,确实写的没让大家明白,为此,我久久不能平静(写了这么久的博客,这是第一篇看到的是不同的声音),想着必须再找时间写一篇。

上一篇文章的链接(不需要策略模式也能避免满屏if/else)

上一篇主要写的太空泛,没扣标题,进而丢掉了核心思想,今天我再写一篇,不说废话,本次可能更多的是案例支撑了,实践出真知嘛,主要是让大家在开发中怎么去用,怎么去写出优质代码,这是硬道理。其实什么是优质,有人说写的让大家都能看懂是优质,有人认为正好相反,正因为写出让大家看不明白的代码才是大神,这里不做过多讨论,我们只是讨论各种方法论和案例,具体怎么用,看大家的整合水品了。

函数式编程

比如现在有这样一种场景,按照不同的机制去对商品打折促销,我举相同的例子,分别用传统的新的函数编程思想去做

传统策略模式思维


interface DiscountStrategy {
    double applyDiscount(double price);
}

class BlackFridayDiscount implements DiscountStrategy {
    @Override
    public double applyDiscount(double price) {
        // 在黑色星期五应用折扣
        if (price > 100) {
            return price * 0.8;  // 80%折扣
        } else {
            return price * 0.9;  // 90%折扣
        }
    }
}

class ChristmasDiscount implements DiscountStrategy {
    @Override
    public double applyDiscount(double price) {
        // 在圣诞节应用折扣
        if (price > 200) {
            return price * 0.7;  // 70%折扣
        } else {
            return price * 0.85;  // 85%折扣
        }
    }
}

public class Main {
    public static void main(String[] args) {
        DiscountStrategy discountStrategy;

        // 根据不同的节日选择不同的折扣策略
        String festival = "Black Friday";
        if (festival.equals("Black Friday")) {
            discountStrategy = new BlackFridayDiscount();
        } else if (festival.equals("Christmas")) {
            discountStrategy = new ChristmasDiscount();
        } else {
            discountStrategy = null;
        }

        double price = 150;
        if (discountStrategy != null) {
            double discountedPrice = discountStrategy.applyDiscount(price);
            System.out.println("Discounted price: " + discountedPrice);
        } else {
            System.out.println("No discount available.");
        }
    }
}

函数思想

下面这个就是利用Function函数编程去达到一个少写if/else的目的。大家可以找找下面的代码中if/else是否还存在!

public static void main(String[] args) {

    Map discountStrategies = new HashMap();

    // 定义不同的折扣策略Lambda表达式
    discountStrategies.put("Black Friday", price -> {
        Function discountStrategy = prices -> prices > 100 ? prices * 0.8 : prices * 0.9;
        return discountStrategy.apply(price);
    });

    discountStrategies.put("Christmas", price -> {
        Function discountStrategy = prices -> prices > 200 ? prices * 0.7 : prices * 0.85;
        return discountStrategy.apply(price);
    });

    // 根据不同的节日选择不同的折扣策略Lambda表达式
    String festival = "Black Friday";
    Function discountStrategy = discountStrategies.get(festival);

    //调用
    double price = 150;
    System.out.println("Discounted price: " + discountStrategy.apply(price));
}

函数式接口可以减少if-else语句的使用,通过使用Lambda表达式和函数式接口的特性,可以更加简洁地实现条件逻辑。想看理论层面的 可以看以前的文章!

再者就是stream流里面的流式判断 也能达到少写if/else的目的,这就不再赘述,大家很熟悉不过了

总结

总而言之,各有利弊,有的说这种写代码不好维护,出问题了也不好找,还是那句话,方法论工具很多,就看自己的选择了。本篇文章是为了弥补以前的缺口,如果你还看不明白,那只能怪自己了,也不要说这些很简单,没意义写。大家对java的stream和lambda很熟,但是这些函数式不一定都熟,大家还是要善于总结和积累

我是老际,欢迎关注公众号“1点东西”,最近在搞AI生态的一些东西,志在变现,有兴趣的可以一起玩玩

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论