策略模式
定义
策略模式基于Java接口来实现,是一种行为模式。
将对象和行为分开,将行为定义为一个行为接口和具体的行为实现(说白了策略模式就是用来解决多个if判断的情况的)。
结构
抽象策略接口(Strategy):策略是一个接口,定义若干抽象方法。
策略实现类(Concrete Strategy):实现抽象策略接口,提供具体实现。
环境上下文(Context):持有一个策略类的引用,最终给到客户端引用。
优缺点
优点:算法可以自由切换,避免使用多重条件判断,扩展性很好。
缺点:后面维护不同策略类会非常多,代码量比较大。
代码实践
例子:电商网站支付方式,一般分为银联、微信、支付宝,可以采用策略模式。
抽象策略接口
/**
* 策略模式基于Java接口实现
* 支付策略接口
*/
public interface PayStartegy {
String toPay();
}
策略实现类
/**
* 支付宝支付策略实现
*/
public class AliPayStartegy implements PayStartegy {
@Override
public String toPay() {
return "支付宝支付。。。";
}
}
/**
* 银联支付策略实现
*/
public class UnionPayStartegy implements PayStartegy {
@Override
public String toPay() {
return "银联支付。。。";
}
}
策略环境上下文
/**
* 策略上下文/环境类
* 负责和具体策略类交互
* 这样的话,具体的算法和直接客户端调用分离了,使得算法可以独立于客户端独立变化。
*/
public class PayStartegyContext {
private PayStartegy payStartegy;
public PayStartegyContext(PayStartegy payStartegy) {
this.payStartegy = payStartegy;
}
public String toPay(){
return payStartegy.toPay();
}
public static void main(String[] args) {
AliPayStartegy aliPayStartegy = new AliPayStartegy();
UnionPayStartegy unionPayStartegy = new UnionPayStartegy();
PayStartegyContext payStartegyContext = new PayStartegyContext(aliPayStartegy);
PayStartegyContext payStartegyContext1 = new PayStartegyContext(unionPayStartegy);
System.out.println(payStartegyContext.toPay());
System.out.println(payStartegyContext1.toPay());
}
}