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

策略模式和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语句,使得代码简洁、利于扩展和维护。例子中使用到的是简单工厂模式,是不符合设计模式中的开闭原则的。可以使用工厂方法模式、抽象工厂模式

相关推荐

  1. 设计模式:工厂模式抽象工厂模式区别

    2024-03-30 10:50:05       33 阅读
  2. 设计模式艺术》笔记 - 策略模式

    2024-03-30 10:50:05       53 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-30 10:50:05       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-30 10:50:05       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-30 10:50:05       87 阅读
  4. Python语言-面向对象

    2024-03-30 10:50:05       96 阅读

热门阅读

  1. 347,前k个高频元素

    2024-03-30 10:50:05       47 阅读
  2. jQuery简介

    2024-03-30 10:50:05       34 阅读
  3. 前端Vue篇之vue3 ref 能处理对象了?

    2024-03-30 10:50:05       48 阅读
  4. K8S Pod 水平自动扩缩容 HPA

    2024-03-30 10:50:05       34 阅读
  5. 进程调度的基本过程

    2024-03-30 10:50:05       43 阅读
  6. 跨站脚本攻击(XSS)测试

    2024-03-30 10:50:05       44 阅读
  7. 面试知识汇总——垃圾回收器(G1垃圾回收器)

    2024-03-30 10:50:05       36 阅读
  8. springMVC

    springMVC

    2024-03-30 10:50:05      40 阅读
  9. Redission快速入门

    2024-03-30 10:50:05       41 阅读
  10. 001-从零学习设计模式-设计原则

    2024-03-30 10:50:05       37 阅读
  11. Redis的数据类型List使用场景实战

    2024-03-30 10:50:05       37 阅读
  12. 如何使用 RabbitMQ 进行消息的发送和接收

    2024-03-30 10:50:05       46 阅读