Javaコールバックとテンプレートメソッドモード
一.Javaコールバックとテンプレートメソッドモード
テンプレートメソッドモードは、1つのメソッドでアルゴリズムスケルトンを定義し、いくつかのステップをサブクラスに遅延させることを目的としてよく使用されます.テンプレートメソッドにより、サブクラスは、アルゴリズム構造を変更することなく、アルゴリズムのいくつかのステップを再定義することができる.標準的なテンプレートメソッドモード実装では、主に継承方式を使用して、親が実行中に子クラスに呼び出すことができるメソッドを使用します.実はJava開発では、Javaコールバック技術は、インタフェースで定義されたメソッドをコールバックすることによって、具体的な実装クラスに呼び出されるメソッドであり、本質はJavaのダイナミックバインド技術を利用することであり、この実装では、実装クラスを個別のクラスに書かなくてもよい.内部クラスまたは匿名の内部クラスを使用してコールバックメソッドを実装します.
二.コールバックメソッドの適用例
1.シーンを適用する
実際の業務では、業務の開始時にスレッドコンテキスト変数を設定し、業務終了時にスレッドコンテキスト変数をクリアするシーンがあります.JDBCの操作後のデータベースリソースの解放に似ています.コールバック法でその実行手順を実現できます.
2.コード実装
(1)ビジネステンプレートを定義し,process()メソッドがアルゴリズムステップである.
public class BusinessTemplate<T> {
private ProcessCallback<T> processCallback;
public BusinessTemplate(ProcessCallback<T> callback) {
this.processCallback = callback;
}
/**
*
*/
public T process() {
try {
System.out.println(ContextHolder.getContext());
return processCallback.process();
} finally {
ContextHolder.clear();
}
}
}
(2)コールバック処理類
public interface ProcessCallback<T> {
/**
* 。
* @return
*/
T process();
}
(3)ContextHolderクラス
public class ContextHolder {
private static final ThreadLocal<Context> threadLocal = new ThreadLocal<Context>();
public static void setContext(Context context) {
threadLocal.set(context);
}
public static Context getContext() {
return threadLocal.get();
}
public static void clear() {
threadLocal.remove();
}
}
(4)テストクラス
public class TestCallBack {
public static void main(String[] args) {
Context context = new Context();
context.setBusinessName("name");
context.setBusinessType("type");
ContextHolder.setContext(context);
BusinessTemplate<BusinessResult> template = new BusinessTemplate<BusinessResult>(
new ProcessCallback<BusinessResult>() {
public BusinessResult process() {
BusinessResult businessResult = new BusinessResult();
return businessResult;
}
});
template.process();
System.out.print(ContextHolder.getContext());
}
}
三.2つの実装方式の比較
1.テンプレートメソッドモードは、継承によって抽象メソッドをサブクラスに拡張または実装し、コンパイル中に静的に決定され、クラスレベル関係である.Javaコールバックメソッドを使用して、動的バインドテクノロジーを使用して実行中に動的に決定されるのは、オブジェクトレベルの関係です.
2.コールバックメカニズムを使用すると、Javaは単一継承なので、継承方式を使用すると、サブクラスでは今後他のオブジェクトを継承できません.コールバックを使用すると、インタフェースベースで、拡張が便利です.また,複数のサブクラスがテンプレートメソッドを使用する場合,すべてのサブクラスがテンプレートメソッドを実現し,サブクラスの個数が無形に増加する.
3.テンプレートメソッドモードを使用して継承方式を使用すると、親が実装方法を提供しているため、子クラスが拡張したくない場合は管理しません.コールバックメカニズムを使用すると、コールバックのインタフェースは拡張される可能性のあるすべての方法を定義する必要があります.これにより、実現するときは、拡張するかどうかにかかわらず、この方法を実現しなければなりません.たとえ何もしなくても、コールバックテンプレートに既存の実現だけを書く必要があります.
既存
1人でメッセージを発表し、猛撃->
ここで<<-ディスカッションに参加
ITeye推奨