美文网首页
策略模式

策略模式

作者: joeylong | 来源:发表于2020-12-10 21:14 被阅读0次
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);
    }
}

相关文章

网友评论

      本文标题:策略模式

      本文链接:https://www.haomeiwen.com/subject/hleiwktx.html