策略模式、策略模式与Spring的碰撞,策略模式与工厂模式
分享于 点击 12355 次 点评:44
策略模式、策略模式与Spring的碰撞,策略模式与工厂模式
实际案例
我工作第三年的时候,重构旅游路线的机票查询模块,旅游路线分为四种情况:
-
如果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()); } }