前言:
作者是未踏入职场的小白,写此篇博客的目的旨在加深自己的策略模式的理解,同时期望能让不了解策略模式的读者有一个简单的认知。
日常生活中,有很多种支付方式:微信、支付宝、银行、现金。对于后端而言,不同支付方式则对应着不同的程序逻辑,脑子里一下就蹦出了if-else分支处理,代码如下:
public void pay(String type){
if(type.equals("wechat")){
System.out.println("微信支付...");
}else if(type.equals("alipay")){
System.out.println("支付宝支付...");
}else if(type.equals("bank")){
System.out.println("银行卡支付...");
}else{
System.out.println("现金支付...");
}
}
就可读性而言,代码是清晰易懂的,但后期由于用户需求需要添加其它支付方式时,我们就只能再继续添加if-else语句,代码如下:
public void pay(String type){
if(type.equals("wechat")){
new WechatHandler().pay();
}else if(type.equals("alipay")){
System.out.println("支付宝支付...");
}else if(type.equals("bank")){
System.out.println("银行卡支付...");
}else if(type.equals("cash")){
System.out.println("现金支付...");
}else{
System.out.println("京东支付...");
}
}
在面向对象的设计原则中,有一个开闭原则:对扩展开放、对修改关闭。我们希望需求变化时,优先考虑创建新的类和子类去扩展,而这种来一个需求就改动代码的处理方式显然不符合开闭原则。接下来我将通过引入策略模式来解决这些冗余的代码。
策略模式:
(1)什么是策略模式?
以上述为例,不同支付方式对应的程序逻辑就是一种策略,我们只需要将这些策略封装到具体的策略类中,并与一个策略接口进行“通信”即可(策略接口只负责声明策略,具体的实现逻辑由策略类决定)。
(2)策略模式有什么优缺点?
优点:解耦,当有新需求时我们只需添加一个新的策略类封装程序逻辑即可,无需改动代码,灵活性较高。
缺点:由于每一种策略都对应一个策略类,所以类的数量较多,在可读性方面也稍逊于if-else模式。
Code:
(1)策略接口:
public interface PaymentHandler {
//只做声明
void pay();
}
(2)具体策略类:
public class WechatPaymentHandler implements PaymentHandler {
@Override
public void pay() {
System.out.println("微信支付...");
}
}
public class AlipayPaymentHandler implements PaymentHandler {
@Override
public void pay() {
System.out.println("支付宝支付...");
}
}
public class BankPaymentHandler implements PaymentHandler {
@Override
public void pay() {
System.out.println("银行卡支付...");
}
}
public class CashPaymentHandler implements PaymentHandler {
@Override
public void pay() {
System.out.println("现金支付");
}
}
pay方法所封装的程序逻辑就是我们所说的“策略”。
(3)测试:
public class PaymentDemo {
public static void main(String[] args) {
PaymentHandler handler = new WechatPaymentHandler();
pay(handler);
}
//方法形参是PaymentHandler,表示与策略接口进行通信(多态)
//传入不同的具体策略类则会执行不同的程序逻辑
public static void pay(PaymentHandler handler){
handler.pay();
}
}
测试结果: