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

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

Example,初始化(美孚FOO);将是一个抽象方法,所以在Example1我想有这样的事情:

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

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

+0

我只瞥了一眼...可能是仿制药在这里有什么帮助吗? – Rekin

+0

这看起来只是一种实现依赖注入的不同方式,而不是它的替代方法...? – Affe

+0

不要重新发明轮子。为DI使用任何可用的框架。 –

回答

1

在我看来,如果您需要像您描述的那样手持物体,在您的OO模型中首先会遇到一些问题。 - 或者你的示例代码没有揭示事物的真实点。

特别是

ExampleManager [...]应该是可修改的Foo对象

Example需要Foo对象的唯一类

看看索姆什么'特别'。

您能否详细说明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(...),只要他们想要进行通信,并且不需要处理回调的任何设置内容。

+0

对不起,这是一个错字,我要编辑我原来的帖子来纠正它。 ExampleManager有一个Foo实例和一个Example实例列表。它修改** Example **对象。 Foo实例实际上是一个EventDispatcher,我在示例中需要它,以便能够在某些条件下分派事件。另一种选择可能是让Foo成为单例对象,但我不知道这是否是一个好主意。 – miviclin

相关问题