一文细读策略模式、策略模式与Spring的碰撞

本文深入探讨了策略模式的应用,通过重构旅游路线的机票查询模块,展示了如何将复杂的if-else逻辑转化为策略模式。文章还讨论了JDK中的Comparator接口作为策略模式的实例,并介绍了Lambda表达式的使用。进一步,文章详细阐述了策略模式与Spring的结合,提供了两种写法,包括如何利用Spring实现策略的自动注入,以达到更优雅、符合开闭原则的代码设计。
摘要由CSDN通过智能技术生成

##前言
策略模式是GoF23种设计模式中比较简单的了,也是常用的设计模式之一,今天我们就来看看策略模式。

实际案例

我工作第三年的时候,重构旅游路线的机票查询模块,旅游路线分为四种情况:

  • 如果A地-B地往返都可以直达,那么查询两张机票(往返)
  • 如果A地-B地去程无法直达,需要中转,但是返程可以直达,那么查询三张机票(去程两张,返程一张)
  • 如果A地-B地去程可以直达,但是返程需要中转,那么查询三张机票(去程一张,返程两张)
  • 如果A地-B地往返都无法直达,那么查询四张机票(去程两张,返程两张)

在我重构前,代码差不多是这样的:

        int type = 1;
        // 往返都可以直达
        if (type == 1) {
            // 查询出两张机票
            return;
        }

        // 去程无法直达,需要中转,但是返程可以直达
        if (type == 2) {
            // 查询出三张机票(去程两张,返程一张)
            return;
        }
        // 去程可以直达,但是返程需要中转
        if (type == 3) {
            // 查询出三张机票(去程一张,返程两张)
            return;
        }
        // 往返都无法直达
        else{
            // 查询出四张机票(去程两张,返程两张)
            return;
        }

当时我还是菜鸡(现在也是),也不懂什么设计模式,就是感觉代码都写在一个类中,实在是太长了,不够清爽,不管是哪种类型的线路,最终都是返回机票集合,只是处理逻辑不同,可以提取一个接口出来,再开四个类去实现此接口,最后定义一个Map,Key是Type,Value是接口(实现类),根据Type决定调用哪个实现类,就像下面的酱紫:

public class Ticket {
    private String desc;

    public Ticket(String desc) {
        this.desc = desc;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    @Override
    public String toString() {
        return "Ticket{" +
                "desc='" + desc + '\'' +
                '}';
    }
}

public interface QueryTicketService {
    List<Ticket> getTicketList();
}

public class QueryTicketAService implements QueryTicketService {
    @Override
    public List<Ticket> getTicketList() {
        List<Ticket> list = new ArrayList<>();
        list.add(new Ticket("去程机票"));
        list.add(new Ticket("返程机票"));
        return list;
    }
}

public class QueryTicketBService implements QueryTicketService {
    @Override
    public List<Ticket> getTicketList() {
        List<Ticket> list = new ArrayList<>();
        list.add(new Ticket("去程第
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值