今天这个模式之前先说说看需求吧.我们在处理业务逻辑过程中经常会碰到这么一个问题,就是很多业务上需要判断, if else 非常多的嵌套.针对不同的条件需要做不同的处理,然后今天给培训的学员说的时候,突然之间就写了个.
就拿订单处理这个问题来说吧. 业务定义,订单支付状态有四种: 未支付,支付中,支付完成,支付错误.
针对不同的状态我们的业务处理也是不一样的,通常情况下我们都是写各种if else每个条件判断写各自的逻辑.
虽然从语法角度看,应该是没啥问题,如果每个状态的处理逻辑写一个方法,最终的处理订单的代码应该看起来比较直观,但是还是不够优雅,然后我就先把我的解决方案的代码贴出来吧.
package com.qunar.study.design.state;
public class Order {
private Integer id;//订单id
private String orderNo;//订单号
private Integer state;//订单状态
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getOrderNo() {
return orderNo;
}
public void setOrderNo(String orderNo) {
this.orderNo = orderNo;
}
public Integer getState() {
return state;
}
public void setState(Integer state) {
this.state = state;
}
}
package com.qunar.study.design.state;
public enum OrderState {
UNPAY(1,"未支付"),
PAYING(2,"支付中"),
PAYED(3,"已支付"),
PAYERROR(4,"支付错误");
private int id;
private String name;
OrderState(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.qunar.study.design.state;
public interface State {
void handle(String orderNo);
}
package com.qunar.study.design.state;
import java.util.List;
public interface OrderService {
void handleOrder(List orderList);
}
package com.qunar.study.design.state;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class OrderServiceImpl implements OrderService {
private static Map stateMap=new HashMap();
{
stateMap=new HashMap();
stateMap.put(OrderState.UNPAY.getId(), new State() {
public void handle(String orderNo) {
handleOrder(orderNo);
}
});
stateMap.put(OrderState.PAYING.getId(), new State() {
public void handle(String orderNo) {
handleOrder(orderNo);
}
});
stateMap.put(OrderState.PAYED.getId(), new State() {
public void handle(String orderNo) {
handleOrder(orderNo);
}
});
stateMap.put(OrderState.PAYERROR.getId(), new State() {
public void handle(String orderNo) {
handleOrder(orderNo);
}
});
}
private static void handleOrder(String orderNo){
System.out.println("orderNo="+orderNo+" 已处理.");
}
public void handleOrder(List orderList) {
for (Order order : orderList) {
stateMap.get(order.getState()).handle(order.getOrderNo());
}
}
}
package com.qunar.study.design.state;
import com.google.common.collect.Lists;
import java.util.List;
import java.util.Random;
public class OrderTest {
public static void main(String[] args) {
List orders= Lists.newArrayList();
for (int i = 0; i < 12; i++) {
Order order=new Order();
order.setState(new Random().nextInt(4)+1);
order.setId(i + 10000);
order.setOrderNo("Qunar1001" + i);
orders.add(order);
}
OrderService orderService=new OrderServiceImpl();
orderService.handleOrder(orders);
}
}
这个逻辑应该算比较简单吧.就是根据不同的状态需要写不同的逻辑处理代码.
我们利用map集合来处理.首先把key设置为我们的处理条件,value设置成我们的逻辑处理代码,并且事先初始化了,这样代码相对清晰些,没有了逻辑判断,就剩下了map的初始化,把业务逻辑网里面堆,后期有其他分支了就需要继续往map中添加值了,但是
需要注意的是根if else判断还是略有区别的,因为有些if else判断是有顺序的,有些条件之间有重合,这个用map就处理的比较困难了.hashMap的顺序跟我们存入的顺序是不一致的,这是需要注意的地方,当然这个思路整体是把条件判断和业务处理相分离.这样代码也相对的优雅些.