策略模式和if-else的区别
策略模式:
- 策略模式是一种设计模式,允许在运行时选择算法的行为
- 在策略模式中,我们定义了一一系列算法,并将这些算法封装在单独的类中,这些类都实现了共同的接口或者继承了共同的抽象类
- 在运行时,可以通过动态参数选择使用哪种算法,无需修改代码。这种方式使得系统更加灵活,易于扩展,并且可以降低代码的耦合度
if-else:
- if-else是一种条件语句,根据条件的真假执行不同的代码
- 使用if-else时,需要程序员显式地编写条件判断语句来确定执行哪一块代码
- 如果有多个条件需要处理,可能会导致代码过长,并且不易于扩展和维护
主要区别:
灵活性:策略模式更灵活,可以在运行时动态选择算法,而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语句,使得代码简洁、利于扩展和维护。例子中使用到的是简单工厂模式,是不符合设计模式中的开闭原则的。可以使用工厂方法模式、抽象工厂模式