策略模式干掉if-else/switch

结构图

策略模式需要一个策略接口,不同的策略实现不同的实现类。

在具体业务环境中仅持有该策略接口,根据不同的场景使用不同的实现类即可。

面向接口编程,而不是面向实现。

策略模式的优点

  1. 干掉繁琐的 if、switch 判断逻辑;
  2. 代码优雅、可复用、可读性好;
  3. 符合开闭原则,扩展性好、便于维护;

策略模式的缺点

  1. 策略如果很多的话,会造成策略类膨胀;
  2. 使用者必须清楚所有的策略类及其用途;

实例

XX 公司是做支付的,根据不同的客户类型会有不同的支付方式和支付产品,比如:信用卡、本地支付,而本地支付在中国又有微信支付、支付宝、云闪付、等更多其他第三方支付公司,这时候策略模式就派上用场了。

定义策略接口

策略接口:所有支付方式的接口

1
2
3
4
5
6
7
/**
* 支付接口
*/
public interface IPayment {
//支付
PayResult pay(Order order);
}

订单信息类:

1
2
3
4
5
6
7
8
/**
* 订单信息
*/
@Data
public class Order {
private int amount;//金额
private String paymentType;//支付类型
}

返回结果类:

1
2
3
4
5
@Data
@AllArgsConstructor
public class PayResult {
private String result;//支付结果
}

定义各种策略

各种支付策略,微信支付、支付宝、云闪付等支付实现类都实现这个接口。

微信支付实现:

1
2
3
4
5
6
7
@Service("WechatPay")
public class WechatPay implements IPayment {
@Override
public PayResult pay(Order order) {
return new PayResult("微信支付成功");
}
}

支付宝实现:

1
2
3
4
5
6
7
@Service("Alipay")
public class Alipay implements IPayment {
@Override
public PayResult pay(Order order) {
return new PayResult("支付宝支付成功");
}
}

云闪付实现:

1
2
3
4
5
6
7
@Service("UnionPay")
public class UnionPay implements IPayment {
@Override
public PayResult pay(Order order) {
return new PayResult("云闪付支付成功");
}
}

使用策略

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
* 支付服务
*/
@RestController
public class PayService {

@Autowired
private ApplicationContext applicationContext;

/**
* 支付接口
*/
@RequestMapping("/pay")
public PayResult pay(@RequestParam("amount") int amount,
@RequestParam("paymentType") String paymentType) {
Order order = new Order();
order.setAmount(amount);
order.setPaymentType(paymentType);

// 根据支付类型获取对应的策略 bean
IPayment payment = applicationContext.getBean(order.getPaymentType(), IPayment.class);

// 开始支付
PayResult payResult = payment.pay(order);

return payResult;
}
}

测试

1
http://localhost:8080/pay?amount=8800&paymentType=WechatPay
0%