策略模式对业务中的可替换部分进行了抽象,使得同一件事情可以使用不同的处理方式来完成。
策略模式通过预先定义一些策略,主逻辑在处理过程中可以自由选择哪种策略来完成。
使用策略模式,可以实现自由选择支付方式、自由选择计算方法、自由选择比较器等等,Java的比较器Comparator就是使用了策略模式,因此可以方便地切换不同的比较器进而完成不同的排序结果。
对比“状态模式”,两者的相似之处在于都可以通过切换可变部分而表现出不同的行为,然却不尽相同:
状态模式旨在将具有依赖关系的“条件”的变化规则独立出来,这样,“条件”可独立于主体而自主变化,不同的“条件”可驱动出不同的主体行为,通常多个主体会共用一个状态;
策略模式旨在完成行为的替换,它通常不影响主体的行为,主体也不关心使用哪种策略,具体的工作在具体的策略中完成,通常一个主体在表现时需要指定具体使用哪种策略。
两者的主要区别在于其行为,状态模式,状态自身可变,行为自主完成,策略模式,自由选择行为,行为在策略中完成。
场景:到超市购物结帐,可选卡支付或现金支付。
分析:支付过程是必须进行的,但支付的方式可由多种,即可以使用不同的支付策略或支付政策,可以使用策略模式来完成。
设计:
示例代码:
package netty_ws;
interface PaymentStrategy {
void pay(int price);
}
class CardStrategy implements PaymentStrategy {
@Override
public void pay(int price) {
System.out.println("使用银行卡付款:" + price);
}
}
class CashStrategy implements PaymentStrategy {
@Override
public void pay(int price) {
System.out.println("使用现金支付:" + price);
}
}
class Shopping {
public void pay(int price, PaymentStrategy paymentStrategy) {
paymentStrategy.pay(price);
}
}
public class Test {
public static void main(String[] args) {
Shopping shopping = new Shopping();
int price = 100;
shopping.pay(price, new CardStrategy());
shopping.pay(price, new CashStrategy());
}
}
输出:
使用银行卡付款:100
使用现金支付:100