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,它应该是唯一修改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需要该Foo对象,但我想知道是否可以摆脱FooExample1 构造函数中的参数,因此如果有人使用该库,则不必调用manager.getFoo()即可创建示例。
我正在考虑以下解决方案,它将隐藏Foo初始化,因此使用该库的人只需实现该initialize(Foo)方法,并且在 将示例添加到)Foo时会自动初始化:更改方法: ExampleManager
ExampleManageradd(Example)

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

Example,初始化(Foo foo);将是一个抽象方法,所以Example1我会有这样的东西:

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

有没有更好的方法来做到这一点?

4

1 回答 1

1

在我看来,如果您需要像您描述的那样处理对象,那么您的 OO 模型首先会出现一些问题。- 或者您的示例代码可能没有揭示事情的真正意义。

尤其

ExampleManager[...] 应该是唯一修改 Foo 对象的类

Example需要 Foo 对象

看起来有些“特别”。

你能详细说明一下ExampleManagerFoo实例之间以及Example和实例之间的交互Foo吗?

好的,关于您的评论,我提出了观察者模式,就像您的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 回答