面对三个同类型的业务逻辑,正常情况通过 if-else 选择,当该类型的业务增加,缺点就显而易见
策略模式解决这个问题
举个例子
多种付款方式选择(支付宝,微信,银行卡,银联…),采用if-else选择的就比较臃肿,当新增付款方式,需要修改所有涉及到选择支付方式的代码,可想而知,难受。可以采用策略模式解决这种问题,通过一个Context类帮我们选择我,我们只需要提供一个flag参数,表明我们需要调用哪种业务
下面通过代码加深对策略模式理解
接口类
public interface Payment {
void doPay();
}
支付宝支付
public class AliPay implements Payment {
@Override
public void doPay() {
System.out.println("支付宝支付!");
}
}
微信支付
public class WeChatPay implements Payment {
@Override
public void doPay() {
System.out.println("微信支付!");
}
}
银联支付
public class UnionPay implements Payment {
@Override
public void doPay() {
System.out.println("银联支付!");
}
}
不采用策略模式
客户端
public static void main(String[] args) {
String method = "****";
if ("ALIPAY".equals(method)){
AliPay aliPay =new AliPay();
aliPay.doPay();
}else if ("UNIONPAY".equals(method)){
UnionPay unionPay = new UnionPay();
unionPay.doPay();
}else{
WeChatPay weChatPay = new WeChatPay();
weChatPay.doPay();
}
}
采用策略模式
增加Context类(普通类)
public class PaymentContext {
Payment payment;
public PaymentContext(Payment payment) {
this.payment = payment;
}
public void doPay(){
payment.doPay();
}
}
客户端
public static void main(String[] args) {
PaymentContext paymentContext = new PaymentContext(new AliPay());
paymentContext.doPay();
}
注意事项:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。
感觉上述方式还需要我们去选择去创建对象
还记的我们学过工厂模式,假如我们把创建对象交给工厂,把创建好的对象放于map中,我们只需要提供一个key,自动匹配我们需要的对象,岂不是美滋滋
下面我们再用代码实现
工厂类
public class PaymentContextFactory {
public static Map<String,Payment> map = new HashMap<String, Payment>();
static {
map.put("ALIPAY",new AliPay());
map.put("UNIONPAY",new UnionPay());
map.put("WECHATPAY",new WeChatPay());
map.put("DEFAULT",new AliPay());
}
public static Payment get(String key){
if (map.containsKey(key)){
return map.get(key);
}else{
return map.get("DEFAULT");
}
}
}
客户端
public static void main(String[] args) {
Payment payment = PaymentContextFactory.get("ALIPAY");
payment.doPay();
}
此时,没有if-else选择,其实通过map匹配,创建对象也交给了工厂类