使用哪种设计模式来实现“数据扩展器”?

时间:2010-11-11 11:46:26

标签: java design-patterns

这就是我要做的事情:

public class DataBuilder {
  public DataBlock create() {
    DataBlock block = new DataBlock();
    for (Extender extender : this.getExtenders()) {
      extender.extend(block);
    }
  }
}

一段时间后:

DataBlock block = new DataBuilder().create();

每个extender都会向block添加一些特定信息。 DataBuilder不想知道这些扩展器的内部结构。目前,我的getExtenders()方法查找Extender的所有子类(在类路径中),并返回它们的实例。

工作正常,但在设计方面我不喜欢它的外观。也许我可以/应该使用一些模式,使这个结构更灵活?

3 个答案:

答案 0 :(得分:1)

继续阿德里安的回答,我将简要解释它是如何运作的:

让我们假设DataBlock派生自一个名为IDataBlock的接口。每个扩展器派生自DataBlockDecorator,它派生自IDataBlock,它对DataBlock进行一些操作(在构造函数中接受IDataBlock)。这允许你做类似的事情。

IDataBlock block = new DataBlock();
for (DataBlockDecorator extender : this.getExtenders()) {
  extender.extend(block);
  block = extender;
}

然而,它并没有真正增加灵活性。就此而言,您的原始解决方案已经变得灵活。

答案 1 :(得分:0)

查看Decorator模式。

答案 2 :(得分:0)

装饰图案

interface BlockDeckorator
{
    extend(DataBlock block);
}

class FooBlockDecoratorImpl implements BlockDecorator
{
    private BlockDeckorator blockDecorator;

    public FooBlockDecoratorImpl(BlockDecorator decorator)
    {
         this.blockDecorator = decorator;
    }

    public void extend(DataBlock block)
    {
         blockDecorator(block);
         // Add my own code to do Foo afterwards (or before)
    }
}