##前言
策略模式是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("去程第