策略模式

2020-12-10  本文已影响0人  joeylong
1、策略模式定义:

该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。它通过感知用户的选择而选择不同的处理方式。

2、策略模式优点:
3、策略模式模块:
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);
    }
}
上一篇 下一篇

猜你喜欢

热点阅读