1、策略模式定义:
该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。它通过感知用户的选择而选择不同的处理方式。
2、策略模式优点:
- 避免使用多重条件语句,如 if...else 语句、switch...case 语句。
- 把算法族的公共代码转移到父类里面,从而避免重复的代码。
3、策略模式模块:
- 抽象策略(Strategy)类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。
- 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现。
- 环境(Context)类:持有一个策略类的引用,最终给客户端调用。
4、代码:
/**
* 抽象策略类:支付方式
*/
public interface PayWay {
void pay();
}
/**
* 具体策略类:支付宝支付
*/
@PayStrategy(1)
public class AliPay implements PayWay{
@Override
public void pay() {
System.out.println("支付宝支付");
}
}
/**
* 具体策略类:微信支付
*/
@PayStrategy(2)
public class WeChatPay implements PayWay{
@Override
public void pay() {
System.out.println("微信支付");
}
}
/**
* 环境类:决定用什么支付方式
*/
public class PayContext {
private static Map<Integer,Class> payStrategyMap = new HashMap<>();
static {
Reflections reflections = new Reflections("com.demo.design.strategy.*");
Set<Class<?>> classes=reflections.getTypesAnnotatedWith(PayStrategy.class);
for(Class<?> cl:classes) {
PayStrategy payStrategy = cl.getAnnotation(PayStrategy.class);
payStrategyMap.put(payStrategy.value(),cl);
}
}
public void pay(int payStrategy) throws IllegalAccessException, InstantiationException {
Class payWayClass = payStrategyMap.get(payStrategy);
PayWay payWay = (PayWay)payWayClass.newInstance();
payWay.pay();
}
}
/**
* 策略注解类
*/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface PayStrategy {
int value() default 0;
}
/**
* 测试
*/
public class StrategyTest {
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
PayContext payContext = new PayContext();
payContext.pay(2);
payContext.pay(1);
}
}
网友评论