🌷一、策略模式
说到策略模式,首先想到的是用策略模式来替换if else
。
我们先想两个问题
🥇什么是策略模式?
🥈策略模式可以用来干什么?
🌸二、什么是策略模式
策略通俗的说就是方式方法,做一件事情根据不同的选择,可以有不同的做事方式,不同的方式就是不同的策略。
举一个生活中的例子
比如要回家这件事,回家需要交通工具,而交通工具有很多种,我们可以通过自己的需求来选择不同的交通工具。
🥇如果想快一点,可以选择飞机;
🥈如果想看风景,可以选择高铁;
🥉如果想舒服一点,可以选择开车想走就走想歇息就歇息;
🌹三、策略模式用来干什么
🌻3.1 if-else代码
上面我们说了策略模式,但是最终都要转换成代码。首先我们把上面描述的例子转换成代码,我们先用if-else
来实现。
public void goHome (String choose){
if (StringUtils.equals(choose, "fast")) {
System.out.println("飞机");
} else if (StringUtils.equals(choose, "landscape")) {
System.out.println("高铁");
} else if (StringUtils.equals(choose, "comfortable")) {
System.out.println("开车");
}
}
我们说设计模式是锦上添花,如果在开发过程中我们用这样的方式写代码也能实现功能,但是要是你真的这样写了估计会被喷的。
😔那么这样写的缺点是什么了
- 不符合开闭原则,开闭原则就是对扩展开放,对修改关闭。如果新增一种交通工具那就要改这个方法。
- 代码阅读性差,这里我们只是简单的输出,实际的业务中还有很多业务代码,揉在一起不容易阅读。
- 复用性差,比如你选择的运输工具是车,那么车不仅仅能运人还能运输货物,如果其它想用这个只能再写一次。
🌺3.2 策略模式改写
1.首先定义一个接口。
public interface Transportation {
void transport();
}
2.然后有不同的交通运输工具种类来实现。
public class Plane implements Transportation{
@Override
public void transport() {
System.out.println("飞机运输");
}
}
public class HighSpeedRail implements Transportation {
@Override
public void transport() {
System.out.println("高铁");
}
}
public class Car implements Transportation {
@Override
public void transport() {
System.out.println("开车");
}
}
3.然后使用。
public void goHome (String choose){
if (StringUtils.equals(choose, "fast")) {
new Plane().transport();
} else if (StringUtils.equals(choose, "landscape")) {
new HighSpeedRail().transport();
} else if (StringUtils.equals(choose, "comfortable")) {
new Car().transport();
}
}
存在的缺点
首先这里还是存在if-else
,虽然业务代码都到具体的类里面去了,但是还是有局限性。
🌼3.3 策略 + 工厂
单独使用策略模式还不够完善,我们实际开发中还要搭配着工厂模式一起来用。
1.先搞一个工厂,工厂主要有两个方法,一个是工厂生产东西,一个是从工厂取东西,生产的肯定就是各种策略,取的也是策略。
public class TransportationFactory {
static Map<String, Transportation> map = new HashMap<>();
// 从工厂的库存中取东西来用
public static Transportation getTransportByChoose(String choose) {
return map.get(choose);
}
// 工厂生产各种策略放到库存中
public static void register(String choose, Transportation transportation) {
map.put(choose, transportation);
}
}
2.项目启动的时候先把所有的策略生产出来,也就是new
出来,然后在使用的时候通过不同的选择获取到不同的策略。这里就完全没有if-else
了。
{
TransportationFactory.register("fast", new Plane());
TransportationFactory.register("landscape", new HighSpeedRail());
TransportationFactory.register("comfortable", new Car());
}
public void goHome (String choose){
Transportation transportation = TransportationFactory.getTransportByChoose(choose);
}
🪷3.4 spring + 策略
策略+工厂简单很多了,但是还有没有更简单的,如果用上spring
这事情就更简单了。
1.还是先定义所有的策略,这里就要加上@Component
注解,就不用我们自己来new
对象了,不过这里我们需要给初始化的对象设置一个名字,这样便于我们获取到对应的策略,也可以不加,但是对象的名字就是类名。
@Component("fast")
public class Plane implements Transportation{
@Override
public void transport() {
System.out.println("飞机运输");
}
}
@Component("landscape")
public class HighSpeedRail implements Transportation {
@Override
public void transport() {
System.out.println("高铁");
}
}
@Component("comfortable")
public class Car implements Transportation {
@Override
public void transport() {
System.out.println("开车");
}
}
2.然后使用
这里用@Autowired
注解就可以把全部的策略实例化到Map
当中,key
是@Component
里面取的名字,value
就是各种策略对象。
@Autowired
private Map<String, Transportation> transportMap;
public void goHome (String choose){
Transportation transportation = transportMap.get(choose);
}