if else 替换方案

替换前

 public void toName(String code) {
        if ("pig".equals(code)) {
            pig.name();
        } else if ("dog".equals(code)) {
            dog.name();
        } else if ("cat".equals(code)) {
            cat.name();
        } else {
            // default
        }

注解方式

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

    String value();

    String name();
}
@Service
@AnimalCode(value = "cat", name = "猫")
public class CatImpl1 implements IAnimal {

    @Override
    public void name() {
        System.out.println("Cat");
    }
}

@Service
@AnimalCode(value = "dog", name = "狗")
public class DogImpl1 implements IAnimal {

    @Override
    public void name() {
        System.out.println("Dog");
    }
}
@Service
public class AnimalService1 implements ApplicationContextAware {

    private static Map<String, IAnimal> animalMap = new HashMap<>();

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        Map<String, Object> beansWithAnnotation = applicationContext.getBeansWithAnnotation(AnimalCode.class);
        beansWithAnnotation.forEach((k, v) -> animalMap.put(v.getClass().getAnnotation(AnimalCode.class).value(), (IAnimal) v));
    }

    public void toName(String code) {
        animalMap.get(code).name();
    }
}

使用

    @Resource
    private AnimalService1 animalService1;

    @Test
    public void toName(){
        animalService1.toName("cat");
    }

循环方式

public interface IAnimal {

    void name();

    boolean isMatch(String code);
}
@Service
public class CatImpl2 implements IAnimal {

    @Override
    public void name() {
        System.out.println("Cat");
    }

    @Override
    public boolean isMatch(String code) {
        return "cat".equals(code);
    }
}
@Service
public class DogImpl2 implements IAnimal {

    @Override
    public void name() {
        System.out.println("Dog");
    }

    @Override
    public boolean isMatch(String code) {
        return "dog".equals(code);
    }
}
@Service
public class AnimalService2 {

    @Resource
    private List<IAnimal> animals;

    public void toName(String code) {
        for (IAnimal animal: animals) {
            if (animal.isMatch(code)) {
                animal.name();
            }
        }
    }
}

使用

   @Resource
    private AnimalService2 animalService2;

    @Test
    public void toName(){
        animalService2.toName("pig");
    }

策略+工厂

@Service
public class DogImpl3 implements IAnimal {

    @PostConstruct
    public void init() {
        StrategyFactory.register("dog", this);
    }

    @Override
    public void name() {
        System.out.println("Dog");
    }
}
@Service
public class PigImpl3 implements IAnimal {

    @PostConstruct
    public void init() {
        StrategyFactory.register("pig", this);
    }

    @Override
    public void name() {
        System.out.println("Pig");
    }
}
public class StrategyFactory {

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

    public static void register(String code, IAnimal animal){
        map.put(code, animal);
    }

    public static IAnimal get(String code){
        return map.get(code);
    }
}
@Service
public class AnimalService3 {

    public void toName(String code) {
        StrategyFactory.get(code).name();
    }
}

使用

    @Resource
    private AnimalService3 animalService3;

    @Test
    public void toName(){
        animalService3.toName("cat");
    }

责任链

public abstract class AnimalHandler {

    @Getter
    @Setter
    protected AnimalHandler next;

    public abstract void name(String code);

    public abstract String code();
}
@Service
public class CatHandlerImpl extends AnimalHandler {

    @Override
    public void name(String code) {
        if (code().equals(code)) {
            System.out.println("Cat");
        } else {
            next.name(code);
        }
    }

    @Override
    public String code() {
        return "cat";
    }
}
@Service
public class DogHandlerImpl extends AnimalHandler {

    @Override
    public void name(String code) {
        if (code().equals(code)) {
            System.out.println("Dog");
        } else {
            next.name(code);
        }
    }

    @Override
    public String code() {
        return "dog";
    }
}
@Service
public class AnimalHandlerChain implements ApplicationContextAware, InitializingBean {

    private ApplicationContext applicationContext;

    private AnimalHandler header;

    @Override
    public void afterPropertiesSet() throws Exception {
        Map<String, AnimalHandler> beansOfType = applicationContext.getBeansOfType(AnimalHandler.class);
        List<AnimalHandler> handlers = new ArrayList<>(beansOfType.values());
        for (int i = 0; i < handlers.size(); i++) {
            AnimalHandler animalHandler = handlers.get(i);
            if (i != handlers.size() - 1) {
                animalHandler.setNext(handlers.get(i + 1));
            }
        }
        header = handlers.get(0);
    }

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

    public void toName(String code) {
        header.name(code);
    }
}

使用

    @Resource
    private AnimalHandlerChain animalHandlerChain;

    @Test
    public void toName(){
        animalHandlerChain.toName("pig");
    }

枚举

@AllArgsConstructor
public enum AnimalEnum {

    /**
     *
     */
    DOG(1, "dog") {
        @Override
        public void names() {
            System.out.println("Dog");
        }
    }, PIG(2, "pig") {
        @Override
        public void names() {
            System.out.println("Pig");
        }
    }, CAT(3, "cat") {
        @Override
        public void names() {
            System.out.println("Cat");
        }
    };

    private int index;
    private String code;

    public abstract void names();

    public static void toName(String code) {
        Arrays.stream(AnimalEnum.values()).filter(x -> x.code.equals(code)).findFirst().orElseThrow().names();
    }
}

使用

  @Test
    public void toName(){
        AnimalEnum.toName("pig");
    }

源码

https://github.com/googalAmbition/googol/tree/master/ifelse

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

tcoding

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

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

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

打赏作者

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

抵扣说明:

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

余额充值