设计模式中的策略模式和if-else的区别

本文对比了策略模式和if-else在灵活性、可维护性和扩展性方面的差异,以及如何通过策略模式结合工厂模式简化条件判断和提高代码可管理性。

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

策略模式和if-else的区别

策略模式:

  1. 策略模式是一种设计模式,允许在运行时选择算法的行为
  2. 在策略模式中,我们定义了一一系列算法,并将这些算法封装在单独的类中,这些类都实现了共同的接口或者继承了共同的抽象类
  3. 在运行时,可以通过动态参数选择使用哪种算法,无需修改代码。这种方式使得系统更加灵活,易于扩展,并且可以降低代码的耦合度

if-else:

  1. if-else是一种条件语句,根据条件的真假执行不同的代码
  2. 使用if-else时,需要程序员显式地编写条件判断语句来确定执行哪一块代码
  3. 如果有多个条件需要处理,可能会导致代码过长,并且不易于扩展和维护

主要区别:

灵活性:策略模式更灵活,可以在运行时动态选择算法,而if-else语句的条件判断是静态的,在编译时就确定好了

可维护性:使用策略模式,添加新的算法只需要添加新的策略类,无需更改原有代码。因此更容易维护,而if-else语句添加新的条件判断可能会导致代码的修改,增加了维护的复杂性

扩展性:策略模式通过添加新的策略类来扩展功能,而if-else语句的扩展则可能需要修改已有的代码

总的来说,策略模式适用于需要在运行时动态选择算法的情况,它提供了更好的可维护性和扩展性;而if-else语句适用于简单的条件判断,但随着条件的增多,会导致代码的复杂度提高。

工厂模式有三种,分别是简单工厂模式、工厂方法模式、抽象工厂模式。三种模式从前到后越来越抽象,也更具有一般性

白话简介

从前,在一个小镇上,有一家家庭面馆。这家面馆以制作各种口味的面条而闻名,包括牛肉面、鸡肉面和素面等等。老板娘是个聪明的女人,她发现每天都有很多顾客来点不同口味的面条,但是她却发现每次都要等很长时间才能做好。

为了提高生产效率,老板娘决定引入简单工厂模式。她聘请了一位厨师长,并设置了一个独立的厨房区域。在厨房里,她放置了三个不同的面条制作区,分别用来制作牛肉、鸡肉和素面。

每当有顾客来点菜,服务员会将订单传递给老板娘。老板娘会根据订单的要求选择相应的面条种类,并通知厨师长。厨师长会将订单送到相应的面条制作区,厨师们会根据订单要求制作出对应口味的面条。

这样一来,无论顾客点的是哪种口味的面条,都可以很快地制作出来。顾客不再需要等待很长时间,而且面馆的运营效率也得到了极大的提高。

通过引入简单工厂模式,这家面馆成功地解决了之前生产效率低下的问题,使得顾客能够更快地享用到美味的面条。

if-else实现

    @Test
    public void ifElseTest(){
        String type = "chicken";
        if ("chicken".equals(type)) {
            System.out.println("鸡肉面");
        } else if ("beef".equals(type)) {
            System.out.println("牛肉面");
        } else if ("vegetarian".equals(type)) {
            System.out.println("素面");
        } else {
            System.out.println("面条不存在");
        }
    }

通过示例代码发现,if-else语句需要对每个条件进行显式编写,如果后续条件多了会导致代码冗余过长,并且不利于扩展和维护

策略模式实现

public interface Noodle {

    /**
     *  制作接口类
     * @author yiridancan
     **/
    void cook();

}
/**
 * 牛肉面实现类
 * @author yiridancan
 **/
public class BeefNoodle implements Noodle{
    @Override
    public void cook() {
        System.out.println("牛肉面正在准备中...");
    }
}



/**
 * 鸡肉面实现类
 * @author yiridancan
 **/
public class ChickenNoodle implements Noodle{
    @Override
    public void cook() {
        System.out.println("鸡肉面正在准备中...");
    }
}


/**
 * 素面实现类
 * @author yiridancan
 **/
public class VegetarianNoodle implements Noodle{
    @Override
    public void cook() {
        System.out.println("素面正在准备中...");
    }
}
/**
 * 简单工厂类
 * @author yiridancan
 **/
public class NoodleFactory {

    public static Noodle getNoodle(String type){
        switch (type){
            case "beef":
                return new BeefNoodle();
            case "chicken":
                return new ChickenNoodle();
            case "vegetarian":
                return new VegetarianNoodle();
            default:
                return null;
        }
    }

}
    @Test
    public void factoryTest(){
        //鸡肉面
        Noodle chicken = NoodleFactory.getNoodle("chicken");
        chicken.cook();

        //牛肉面
        Noodle beef = NoodleFactory.getNoodle("beef");
        beef.cook();

        //素面
        Noodle vegetarian = NoodleFactory.getNoodle("vegetarian");
        vegetarian.cook();
    }

首先定义了一个公共的Noodle抽象类,然后定义了BeefNoodle、ChickenNoodle、VegetarianNoodle三个策略类,它们分别是牛肉面、鸡肉面、素面,都实现了Noodle类的cook接口

接着定义了一个NoodleFactory简单工厂类,其中有一个静态方法getNoodle,根据传入的参数类型创建相对于的策略类

最后,在测试代码中,通过调用简单工厂的 getNoodle方法来创建不同类型的策略类,并调用其 cook 方法来制作面条

结论

通过策略模式+工厂模式可以避免复杂的if-else语句,使得代码简洁、利于扩展和维护。例子中使用到的是简单工厂模式,是不符合设计模式中的开闭原则的。可以使用工厂方法模式、抽象工厂模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿Mr.wu

你的鼓励师我创造最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值