2011-02-03 19 views
2

私はその後、私は工場クラスの派生 - ビジターパターン

public class SomeBusinessServiceFactory { 
    public SomeBusinessService createService 
       (Class<? extends SomeBusinessService> clazz){ 
     //do some stuff to create appropriate class derivation on the fly 
    // that will have accept() method implemented 
    } 
} 
を作成したいと思います

public interface Visitable<T>{ 
    public void accept(T visitor); 
} 

public interface SomeBusinessService implements Visitable<SomeVisitor>{ 

    public void mtd1(); 
    public void mtd2(); 
} 

public abstract class SomeBusinessBean1 implements SomeBusinessService { 
    public void mtd1(){} 
    public void mtd2(){} 
} 

public abstract class SomeBusinessBean2 implements SomeBusinessService { 
    ... 
} 

ので、このような方法で、ビジターパターンを作成したいです

と私は次のようにそれを呼び出すことができます

SomeBusinessService service = 
    SomeBusinessServiceFactory.createService(SomeBusinessBean1.class); 

このアプローチでは、 がVisitorインターフェイスのaccept()メソッドを実装するすべてのBeanに対して、comman抽象クラスを作成する必要はありません。

このソリューションは、クラス階層ごとにサービスファクトリに応じて特定のメソッドの共通の動作をしたい場合にも使用できます。

標準のjdkでこれを行う方法はありますか、あるいは私はcglibのような外部ツールを使う必要がありますか、あるいは私が言うことはごみであり、他の方法でその目標を達成することができます。

先進

+0

だけclarificatin用: 'Visitor'と' Visitable'は「同じ」であり、それは、問題のタイプミスだか、二つの異なるインターフェースを持っていますか? –

+0

通常、「訪問者」は、「訪問可能」クラスを訪問できるものを表します。 – aioobe

+0

申し訳ありませんが私の悪い私は訪問可能を実装しています。訪問者クラスは適切なクラスを入力引数として持つvisit()メソッドのみを持ちます –

答えて

0

で送信しますが、JavaのリフレクションAPIを見ているよりも、そのクラスのオブジェクトからクラスのインスタンスを作成する方法を探している場合。

clazz.newInstanze(); 

または

clazz.getConstructors(...).newInstance(...); 
+0

私の派生は抽象クラスなので、私はそれを行うことはできません。私は匿名クラスを素早く作成したいと思っていますが、コンパイル時ではなく実行時にどのクラスを拡張するかを決めたいと思っています。 –

+0

@Marcin Michalskiこの匿名クラスはどうすればよいですか? – Ralph

+0

よくあるこの匿名クラスは、不要なクラスメソッドaccept()が実装されていないVisitable実装です。エンティティBeanのプロパティが抽象getter/setterであり、コンテナがデプロイ時にエンティティBeanクラスを拡張する役割を担うEJB2.xエンティティBeanと同様のものを実現したいと思います。私はASMライブラリについて読んで始めました。それはそれを整理するのに役立ちます。結果として、クラス階層のグループに対する共通の動作をランタイムで判断できるような仕組みになる可能性があります –

関連する問題