3

これは私が現在設計しているものの単純化された例です。

public class ExampleManager {

    private Foo foo;
    private ArrayList<Example> examples;
    ...

    public ExampleManager() {
        this.foo = new Foo();
        this.examples = new ArrayList<Example>();
    }

    public void add(Example e) {
        examples.add(e);
    }

    public void doSomethingWithExamples() {
        for (int i = 0; i < examples.size(); i++) {
            examples.get(i).doSomething();
        }
    }
    ...
}

public abstract class Example {
    private Foo foo;

    public Example(Foo foo) {
        this.foo = foo;
    }
    ...
}

ライブラリを使用するには、Exampleクラスを拡張し、ExampleManagerに例を追加する必要があります。ExampleManagerは、オブジェクトを変更する唯一のクラスである必要がありExampleます。
だから私はこのExample1クラスを持っています:

public class Example1 extends Example {

    public Example1(Foo foo) {
        super(foo);
    }
    ...
}

そして私は現在このようにマネージャーを初期化します:

ExampleManager manager = new ExampleManager();
Example1 example1 = new Example1(manager.getFoo());
manager.add(example1);

オブジェクトがExample必要ですが、 Example1コンストラクターの引数を削除できるかどうか疑問に思っているので、誰かがライブラリを使用している場合は、Exampleを作成するために呼び出す必要はありません。 私は次の解決策を考えています。これは初期化を非表示にするので、ライブラリを使用する人はメソッドを実装するだけで、例を)に追加すると自動的に初期化されます 。: FooFoomanager.getFoo()
Fooinitialize(Foo)FooExampleManager
ExampleManageradd(Example)

public void add(Example e) {
    e.initialize(foo);
    examples.add(e);
}

Example、initialize(Foo foo); 抽象メソッドになるので、次のExample1ようになります。

@Override
public void initialize(Foo foo) {
    this.foo = foo;
}

これを行うためのより良い方法はありますか?

4

1 に答える 1

1

あなたが説明したようにオブジェクトを渡す必要がある場合、最初にオブジェクト指向モデルに問題があるように思えます。- あるいは、あなたのサンプル コードが物事の本質を明らかにしていないかもしれません。

特に

ExampleManager[...] Foo オブジェクトを変更する唯一のクラスにする必要があります

ExampleFoo オブジェクトが必要です

やや「特別」に見えます。

とインスタンスの間、およびExampleManagerFooインスタンスの間の相互作用について詳しく説明していただけますか?ExampleFoo

わかりました、あなたのコメントに関して、私はあなたのinitialize()アプローチと同じようにオブザーバーパターンを提案します:

public abstract class Example {
    protected Foo callbackHandler;

    public void setCallbackHandler( Foo handler ) {
        this.callbackHandler = handler;
    }

    protected void doCallback( SomeType event ) {
        if ( this.callbackHandler != null ) {
            this.callbackHandler.doYourThing( event );
        }
    }
}

オブジェクトが追加されたときに、それ自体またはそのインスタンスをコールバック ハンドラとして登録ExampleManagerします。Foo非抽象サブクラスは、doCallback(...)何かを通信したいときはいつでも呼び出す必要があり、コールバックのセットアップを処理する必要はありません。

于 2012-11-13T21:10:09.867 に答える