リファレンスデザインパターン- Strategyパターン我々はのif-elseコードセグメントを最適化することができ、かつで春(ブーツ)、助けを借りてのApplicationContextのスキャン、コードをよりきれいにすることができます。
いくつかの単語の男、梁コードは言いました:
まず、戦略パターンの表現によれば、処理戦略を区別するためのハンドルインタフェースを作成します。
public interface ITypeHandle {
/**
* 不同的业务操作
*
* @return 对应的操作结果
*/
String working();
/**
* 声明用于处理的业务(方便查看而已)
*
* @return 业务名称
*/
String handleType();
}
そして、対応する作成ウェイクプロセッサおよびプロセッサ睡眠を:
// 起床操作
public class WakeTypeHandle implements ITypeHandle {
@Override
public String working() {
try {
// 模拟业务操作
Thread.sleep(100);
} catch (Exception ex) {
return "Wake Interrupt";
}
return "Wake up Wake up Wake up";
}
@Override
public String handleType() {
return "wake";
}
}
// 睡觉操作
public class SleepTypeHandle implements ITypeHandle {
@Override
public String working() {
try {
// 模拟业务操作
Thread.sleep(500);
} catch (Exception ex) {
return "Sleep Interrupt";
}
return "Sleep Sleep Sleep Zzzzzzzzzzzzz";
}
@Override
public String handleType() {
return "sleep";
}
}
簡潔には、ポリシーコンテキストの動作モードは、異なるプロセッサを切り替える異なるサービスによって処理されます。春には、あなたが完了するのApplicationContextとComponentScanを利用することができます。
確立戦略工場:
public class TypeHandleFactory {
private Map<String , ITypeHandle> map;
@Autowired
private ApplicationContext applicationContext;
@PostConstruct
private void init(){
Map<String ,ITypeHandle> beans=applicationContext.getBeansOfType(ITypeHandle.class);
map= new HashMap<>(beans.size());
for (ITypeHandle handle : beans.values()) {
map.put(handle.handleType(),handle);
}
}
public ITypeHandle getInstance(String type){
return map.get(type);
}
}
ここで初期化は、注射のApplicationContextが完了した後に行うので、追加する必要があります@PostConstruct
コメントを。春では、クラス注釈の一次配列が行われます构造方法=>@Autowired=>@PostConstruct=>@PreDestroy=>销毁
。また、あなたは戦略の工場と2つのハンドラの観点で追加する必要が@Component
メモやで@ComponentScan
スキャン。
ビジネス層をシミュレートするために、サービスクラスを追加します:
@Service
public class MainServiceImpl {
@Autowired
private TypeHandleFactory factory ;
@Override
public String work(String type){
ITypeHandle handler = factory.getInstance(type);
return handler.working();
}
}
これまでのところ、我々は春に構築するための戦略モードを完了しました。あなたは、テストクラスのテストを書くことができます。
@SpringBootTest
class MainServiceImplTest {
@Autowired
private MainServiceImpl service;
@Test
void work(){
String typeA="wake";
String typeB="sleep";
System.out.println(service.work(typeA));
System.out.println(service.work(typeB));
}
}
ログは、として印刷しました:
Wake up Wake up Wake up
Sleep Sleep Sleep Zzzzzzzzzzzzz
Strategyパターンは、春の最適化に完成しました。