定义:定义算法族,分别封装起来,让他们之前可以相互替换,算法的变化独立于使用算法的客户
优点:策略类之间可以切换,由于策略类实现同一个抽象,所以他们之间可以自由切换
易于扩展,增加一个新的策略对策略模式来说非常容易,基本上可以在不改变原来代码的基础上进行扩展
避免使用多重条件
缺点: 维护各个策略类会给开发带来额外开销
必须对客户端(调用者) 暴露所有的策略类
模式适用场景:
1)许多相关的类仅仅是行为有异。
2)需要使用一个算法的不同变体。
3)算法使用客户不应该知道的数据。
4)一个类定义了多种行为 , 并且这些行为在这个类的操作中以多个条件语句的形式出现。
public interface IPayStrategy{
public void pay();//支付
}
public interface IPayStrategy{
public void pay();//支付
}
public interface IPayStrategy{
public void pay();//支付
}
public interface IPayStrategy{
public void pay();//支付
}
//负责调度,执行入口的上下文 context
public class PayStrategyContext {
private IPayStrategy payStrategy;
public PayStrategyContext() {
}
/**
* 执行支付
*/
public void excutePay() {
if (null == payStrategy) {
throw new RuntimeException("支付策略未配置");
}
payStrategy.pay();
}
public IPayStrategy getPayStrategy() {
return payStrategy;
}
public void setPayStrategy(IPayStrategy payStrategy) {
this.payStrategy = payStrategy;
}
}
public class MainTest {
public static void main(String[] args) {
//执行上下文
PayStrategyContext payStrategyContext = new PayStrategyContext();
IPayStrategy payStrategy = null;
//1.支付宝支付
payStrategy = new AliPayStrategy();
payStrategyContext.setPayStrategy(payStrategy);
payStrategyContext.excutePay();
//2.微信支付
payStrategy = new WexinPayStrategy();
payStrategyContext.setPayStrategy(payStrategy);
payStrategyContext.excutePay();
//3.银联支付
payStrategy = new EBankPayStrategy();
payStrategyContext.setPayStrategy(payStrategy);
payStrategyContext.excutePay();
}
}