替换前
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 {
}
注解方式
@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