代码之家  ›  专栏  ›  技术社区  ›  yegor256

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

  •  1
  • yegor256  · 技术社区  · 14 年前

    这就是我要做的:

    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 回复  |  直到 14 年前
        1
  •  1
  •   Neil    14 年前

    继续阿德里安的回答,我将简单地解释它的工作原理:

    假设DataBlock从一个名为IDataBlock的接口派生。每个扩展程序都派生自DataBlockDecorator,后者派生自对DataBlock执行某些操作的IDataBlock(在构造函数中接受IDataBlock)。这允许你做一些类似的事情。

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

    然而,它并没有比以前增加更多的灵活性。在这方面,你原来的解决方案已经变得灵活了。

        2
  •  0
  •   Adrian Grigore    14 年前

    看看 Decorator 模式。

        3
  •  0
  •   willcodejavaforfood    14 年前

    装饰器模式

    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)
        }
    }