别在再满屏的 if、else 了,试试策略模式,真香!!

原文来源于:程序员恰恰

如有侵权,联系删除

代码中的if/ else/ switch太多,代码会显得很臃肿,后期维护难度也大,本文教你如何用策略模式干掉 if/ else/ switch,让你的代码看起来更优雅。

什么是策略模式?

比如说对象的某个行为,在不同场景中有不同的实现方式,这样就可以将这些实现方式定义成一组策略,每个实现类对应一个策略,在不同的场景就使用不同的实现类,并且可以自由切换策略。

策略模式结构图如下:

图片

举个例子:

出行旅游:我们可以有几个策略可以考虑:可以骑自行车,汽车,做火车,飞机。每个策略都可以得到相同的结果,但是它们使用了不同的资源。选择策略的依据是费用,时间,使用工具还有每种方式的方便程度 。

图片

1、定义策略接口

定义一个策略接口,所有出行方式的接口。

策略接口:

package com.it001.startegy;
/**
 * author:公众号:java狂神
 * Date:2021/5/22
 * Time:1:40 下午
 */
public interface TravelStrategy {
   Result travel(String travelType);
}

返回结果类:

package com.it001.startegy;

import lombok.AllArgsConstructor;
import lombok.Data;

/**
 * author:公众号:java狂神
 * Date:2021/5/22
 * Time:1:41 下午
 */
@Data
@AllArgsConstructor
public class Result {
    private String traveType;
}

2、定义各种策略

定义各种出行策略,坐飞机、骑自行车、乘坐火车等出行方式实现类都实现这个接口。

坐飞机实现:

/**
 * author:公众号:java狂神
 * Date:2021/5/22
 * Time:1:42 下午
 */
@Service("AirPlane")
public class AirPlanelStrategy implements TravelStrategy {
    @Override
    public Result travel(String travelType) {
        return new Result("坐飞机");
    }
}


骑自行车实现:

/**
 * author:公众号:java狂神
 * Date:2021/5/22
 * Time:1:46 下午
 */
@Service("Bicycle")
public class BicycleStrategy implements TravelStrategy {
    @Override
    public Result travel(String travelType) {
        return new Result("骑自行车!");
    }
}

乘坐火车实现:

/**
 * author:公众号:java狂神
 * Date:2021/5/22
 * Time:1:45 下午
 */
@Service("Train")
public class TrainStrategy implements TravelStrategy {

    @Override
    public Result travel(String travelType) {
        return new Result("乘坐火车");
    }
}

这里我把所有出行方式类都用 @Service 注解生成 Bean 放入 Spring Bean 容器中了,在使用策略的时候就不用 new 支付对象了,可以直接使用 Bean,这样更贴近业务。

3、使用策略

我把每一种出行方式,当做参数传递到方法参数里面,他就会调用与之匹配的实现方法!

@RestController
public class TraveController {

    @Autowired
    private ApplicationContext applicationContext;

    @GetMapping("/travelSelect")
    @ResponseBody
    public Result Travel(@RequestParam("traveType") String traveType) {

        // 根据出行方式类型获取对应的策略 bean
        TravelStrategy travelStrategy = applicationContext.getBean(traveType, TravelStrategy.class );
        // 出行
        Result result = travelStrategy.travel(traveType);
        return result;
    }
}

测试一下:

图片

图片

图片

测试 OK,传入不同的出行方式会调用不同的策略。

以上代码都是java中的基础知识。运用设计模式中的策略模式。把变化的部分提取出来变为接口+实现。

策略模式注意点:

1.分析项目中变化部分与不变部分

2.多用组合少用继承;用行为类组合,而不是行为的继承。更有弹性。

3.设计模式没有相应的库直接使用,有些库或框架本身就用某种设计模式设计的。

4.使用策略模式,我们可以轻松干掉大量的 if/ else,代码也更优雅,还能很灵活的扩展。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值