策略模式
概念
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
使用场景
挑选一种算法来作出某种选择。在有多种算法相似的情况下,避免使用 if…else 所带来的复杂和难以维护
实际应用
选择支付方式、出行方式
优缺点
优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。
缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。
代码实现
网购下单时选择某种支付方式
/**
* 支付方式接口
*/
public interface Payment {
void pay(Order order);
}
/**
* 支付方式
*/
public class AliPay implements Payment{
@Override
public void pay(Order order) {
System.out.println("开始支付宝支付..\n订单编号:"+order.getOrderId());
}
}
public class WechatPay implements Payment{
@Override
public void pay(Order order) {
System.out.println("开始微信支付..\n订单编号:"+order.getOrderId());
}
}
public class UnionPay implements Payment{
@Override
public void pay(Order order) {
System.out.println("开始银联支付..\n订单编号:"+order.getOrderId());
}
}
/**
* 订单
*/
@Data
@AllArgsConstructor
public class Order {
private String orderId ;//订单编号
private int money ;//单位分
}
/**
* 支付枚举,避免了if/else
*/
public enum PayType {
AliPay(new AliPay()),
UnionPay(new UnionPay()),
WechatPay(new WechatPay());
private Payment payment;
PayType(Payment payment) {
this.payment = payment;
}
public void pay(Order order){
payment.pay(order);
}
}
测试类
public class Test {
public static void main(String[] args) {
// 下单
Order order = new Order("202103030101",1000);
// 选择支付方式付款
// 此处一般由客户端传递字符串到服务端,服务端得到枚举对象,
// 优点是解耦,省略了switch 和 if/else 判断
PayType.AliPay.pay(order);
// 控制台输出
// 开始支付宝支付..
// 订单编号:202103030101
}