使用場景
如果在代碼中出現大量if判斷,再執行一些比較復雜的業務操作,類似於以下情況。
@Test
void test() {
String str = "A";
if (str.equals("A")) {
System.out.println("A的方法1");
} else if (str.equals("B")) {
System.out.println("B的方法1");
}
}
此時如果使用if的重復判斷,則代碼過於冗長。
解決方法
采用工廠模式,策略模式,模版方法設計模式
1、創建一個抽象類,實現InitializingBean接口,由if對應條件的子類來實現
/**
* 模版方法設計模式
*/
public abstract class FunService implements InitializingBean {
public void fun1() {
throw new UnsupportedOperationException();
}
public void fun2() {
throw new UnsupportedOperationException();
}
}
2、子類實現
import com.example.demo.manage.FunFactory;
import com.example.demo.service.FunService;
import org.springframework.stereotype.Service;
@Service
public class AService extends FunService {
@Override
public void fun1() {
System.out.println("A的方法1");
}
@Override
public void fun2() {
System.out.println("A的方法2");
}
@Override
public void afterPropertiesSet() throws Exception {
FunFactory.register("A", this);
}
}
InitializingBean接口
方法afterPropertiesSet 是在類中的屬性被注入后,再執行,一般用於對不可注入的類變量進行定義。
3、定義工廠,和策略的map
/**
* 工廠模式 策略模式
*/
public class FunFactory {
private static Map<String, FunService> map = new HashMap<>();
public static FunService getService(String str) {
return map.get(str);
}
public static void register(String str, FunService service) {
if (StringUtils.isEmpty(str) || Objects.isNull(service)) return;
map.put(str, service);
}
}
在所有實現類的afterPropertiesSet方法中,向工廠注冊。
4、執行
@Test
void contextLoads() {
String str = "A";
FunService service = FunFactory.getService(str);
service.fun1();
}
小節
改進后的代碼符合開閉原則,即是對於新的條件,只需要添加一個javabean,而不需言重新修改代碼。