策略模式
简介:策略模式定义了一系列算法,并将算法封装起来,使他们可以相互替换,且算法的变化不影响使用算法的客户;把使用算法的责任和算法的实现分割开,并委派给不同的对象对这些算法进行管理
主要角色
- 抽象算法类(Strategy) 定义公共接口
- 具体策略实现类(ConCrete Strategy) 具体实现类实现具体的算法
- 环境类(Context) 持有一个策略类的引用,给客户端调用
应用场景:
- 电商中的支付方式,随着版本的迭代支持的支付方式可能会越来越多
- 消息推送方式等
实现(支付为例)
- 抽象算法类
public interface PaymentStrategy {
public void pay(int amount);
}
- 实现类
/******
* 信用卡支付
*
**/
public class CreditCardStrategy implements PaymentStrategy(){
private String name;
private String cardNumber;
private String cvv;
private String dateOfExpiry;
public CreditCardStrategy(String nm, String ccNum, String cvv, String expiryDate){
this.name=nm;
this.cardNumber=ccNum;
this.cvv=cvv;
this.dateOfExpiry=expiryDate;
}
@Override
public void pay(int amount) {
System.out.println(amount +" paid with credit/debit card");
}
}
/******
* 支付宝支付
*
**/
public class AlipayCardStrategy implements PaymentStrategy(){
private String tel;
private String password;
public AlipayCardStrategy (String tel, String password ){
this.tel=tel;
this.password =password ;
}
@Override
public void pay(int amount) {
System.out.println(amount +" paid with Alipay");
}
}
- 环境类(选择支付方式调用支付)
public class PayContext(){
PaymentStrategy paymentStrategy = null;
//初始化默认支付方式
public PayContext(PaymentStrategy paymentStrategy ){
this.paymentStrategy = paymentStrategy ;
}
//选择支付方式
public void setPaymentStrategy (PaymentStrategy paymentStrategy ){
this.paymentStrategy = paymentStrategy ;
}
//支付
public void pay(int amount ){
paymentStrategy.pay(amount )
}
}
总结
优点:解耦,可读性、扩展性增强
缺点:要了解所有的实现策略方法