设计模式之-策略模式

🌷一、策略模式

说到策略模式,首先想到的是用策略模式来替换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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值