定义
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
使用场景:
- 针对同一类型问题,有多种处理方式,每一种都能独立解决问题
- 需要自由切换算法的场景
- 需要屏蔽算法规则的场景
三个角色:
- context:上下文,用于操作策略的上下文环境,屏蔽高层模块(客户端)对策略算法的直接访问,封装可能存在的变化
- 抽象策略角色:Strategy,规定策略或算法的行为
- 具体策略:具体策略或算法
场景
现在需要支付,我们有多种支付手段,支付宝,微信等,用策略模式编写如下
//支付接口(Strategy)
public interface Payment {
public void pay();
}
public class Alipay implements Payment{
@Override
public void pay() {
System.out.println("支付宝支付");
}
}
public class WechatPay implements Payment{
@Override
public void pay() {
System.out.println("微信支付");
}
}
//上下文,通过该上下文执行不同策略
public class PayContext {
private Payment payment;
public PayContext(Payment payment) {
this.payment = payment;
}
public void executePay(){
payment.pay();
}
}
测试:
public static void main(String[] args) {
PayContext payContext = new PayContext(new Alipay());
payContext.executePay();
//可以使用匿名内部类的方式(lambda表达式)
PayContext context = new PayContext(() -> System.out.println("银联支付"));
context.executePay();
}
uml类图:
在实际工作中,策略模式具体用法可以灵活,可以和工厂模式,单例模式,委派模式等模式相结合,并且可以结合注解,反射,枚举等。但不变的还是Context上下文和Strategy策略接口,核心还是抓住这两点。