java策略模式在项目中实战案例

        策略模式把对象本身和运算规则区分开来,因此我们整个模式也分为三个部分。

  • 环境类(Context):用来操作策略的上下文环境,持有一个 Strategy 的引用
  • 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
  • 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。

具体代码如下:

 1、定义抽象策略接口

package com.design.pattern.strategy.strategy;

/**
 * 抽象策略类
 */
public interface TravelerStrategy {

    void style();

}

2、具体策略类

策略类1

package com.design.pattern.strategy.concreteStrategy;

import com.design.pattern.strategy.strategy.Strategy;
import com.design.pattern.strategy.strategy.TravelerStrategy;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

@Slf4j
@Strategy("air")
@Component
public class AirStrategy implements TravelerStrategy {
    @Override
    public void style() {
      log.info("乘坐飞机...");
    }
}

策略类2

package com.design.pattern.strategy.concreteStrategy;

import com.design.pattern.strategy.strategy.Strategy;
import com.design.pattern.strategy.strategy.TravelerStrategy;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

@Slf4j
@Strategy("highTrain")
@Component
public class HighTrainStrategy implements TravelerStrategy {
    @Override
    public void style() {
        log.info("乘坐高铁...");
    }
}

策略类3

package com.design.pattern.strategy.concreteStrategy;

import com.design.pattern.strategy.strategy.Strategy;
import com.design.pattern.strategy.strategy.TravelerStrategy;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

@Slf4j
@Strategy("train")
@Component
public class TrainStrategy implements TravelerStrategy {
    @Override
    public void style() {
        log.info("乘坐火车...");
    }
}

3、自定义注解 @Strategy

package com.design.pattern.strategy.strategy;

import java.lang.annotation.*;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Strategy {

    String value();

}

4、环境类实现

package com.design.pattern.strategy.context;

import com.design.pattern.strategy.strategy.Strategy;
import com.design.pattern.strategy.strategy.TravelerStrategy;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

@Slf4j
@Component
public class TravelerManager implements ApplicationListener<ContextRefreshedEvent>, ApplicationContextAware {

    private ApplicationContext applicationContext;

    private Map<String, TravelerStrategy> map = new HashMap<>();

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        log.info("解析策略模式");
        Map<String, Object> beansWithAnnotation = applicationContext.getBeansWithAnnotation(Strategy.class);

        beansWithAnnotation.keySet().forEach(key -> {
            Object o = beansWithAnnotation.get(key);

            String value = o.getClass().getAnnotation(Strategy.class).value();
            if (o instanceof TravelerStrategy) {
                map.put(value, (TravelerStrategy) o);
            }
        });

        test("air");
        test("train");
    }

    private void test(String strategy) {
        TravelerStrategy travelerStrategy = map.get(strategy);
        travelerStrategy.style();
    }
}

 启动项目时会自动将策略封装到 map 中,根据传入的策略参数执行具体的策略,执行结果如下:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱打斯诺克的码农飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值