策略模式、策略模式与Spring的碰撞

JAVA学习网 2020-07-01 12:50:04

策略模式是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("去程第一张机票"));
         list.add(new Ticket("去程第二张机票"));
         list.add(new Ticket("返程机票"));
         return list;
     }
 }
 ​
 public class QueryTicketCService implements QueryTicketService {
     @Override
     public List<Ticket> getTicketList() {
         List<Ticket> list = new ArrayList<>();
         list.add(new Ticket("去程机票"));
         list.add(new Ticket("返程第一张机票"));
         list.add(new Ticket("返程第二张机票"));
         return list;
     }
 }
 ​
 public class QueryTicketDService implements QueryTicketService {
     @Override
     public List<Ticket> getTicketList() {
         List<Ticket> list = new ArrayList<>();
         list.add(new Ticket("去程第一张机票"));
         list.add(new Ticket("去程第二张机票"));
         list.add(new Ticket("返程第一张机票"));
         list.add(new Ticket("返程第二张机票"));
         return list;
     }
 }
 ​
 public class Main {
     static Map<Integer, QueryTicketService> map = new HashMap<>();
 ​
     static {
         map.put(1, new QueryTicketAService());
         map.put(2, new QueryTicketBService());
         map.put(3, new QueryTicketCService());
         map.put(4, new QueryTicketDService());
     }
 ​
     public static void main(String[] args) {
         int type = 1;
         System.out.println(map.get(type).getTicketList());
     }
 }

 

阅读(2227) 评论(0)