【问题标题】:Java Decorating The Easy WayJava 装饰的简单方法
【发布时间】:2010-07-01 17:30:12
【问题描述】:

假设您有一个无法更改的 API:

List<LegacyObject> getImportantThingFromDatabase(Criteria c);

Imaging Legacy Object 有大量字段,您希望对其进行扩展以更轻松地获取某些信息:

class ImprovedLegacyObject extends LegacyObject {
   String getSomeFieldThatUsuallyRequiresIteratorsAndAllSortsOfCrap() {
       //cool code that makes things easier goes here
   }
}

但是,您不能只转换为 ImprovedLegacyObject,即使字段都相同并且您没有更改任何底层代码,您只是添加到它以便使用 @ 的代码987654324@ 仍然有效,但新代码更容易编写。

是否有可能有一些简单的方法将LegacyObject 转换为ImprovedLegacyObject 而无需重新创建所有字段或访问器?这也应该是一个快速的操作,我知道您可以通过使用反射来复制所有属性来执行某些操作,但我认为这对于大量 LegacyObjects 这样做还不够快

编辑:你可以用静态方法做些什么吗?装饰现有对象?

【问题讨论】:

    标签: java algorithm decorator


    【解决方案1】:

    您必须自己执行复制。您可以使用一个构造函数来执行此操作(称为复制构造函数):

    public ImprovedLegacyObject(LegacyObject legacyObject) {        
      ...
      //copy stuff over
    
      this.someField = legacyObject.getSomeField();
      this.anotherField = legacyObject.getAnotherField();
      ...
    }
    

    或者你可以有一个返回ImprovedLegacyObject的静态工厂方法

    public static ImprovedLegacyObject create(LegacyObject legacyObject) {
      ...
      //copy stuff over
      ...
      return improvedLegacyObject;
    }
    

    如果您打算将此行为扩展到其他遗留对象,那么您应该创建一个接口

    public interface CoolNewCodeInterface {
    
       public String getSomeFieldThatUsuallyRequiresIteratorsAndAllSortsOfCrap() {
    
       }
    
       public String getSomeFieldInAReallyCoolWay() {
    
       }
    }
    

    那么您的ImprovedLegacyObject 将如下所示:

    public ImprovedLegacyObject extends LegacyObject implements CoolNewCodeInterface {
    
      //implement methods from interface
    }
    

    【讨论】:

    • 是的,我想这可能是我唯一的方法:o。由于懒惰,我试图避免这种情况......但是如果Java有一种方法可以做到这一点,而不必创建额外的对象并对所有属性执行写入操作,那就太棒了。如果没有其他人想出更好的东西,我会接受这个
    【解决方案2】:

    如何为您的改进的遗留对象创建一个以遗留对象作为参数的复制构造函数。然后从旧对象创建新对象。

    【讨论】:

    • 复制构造函数会手动将旧对象的每个属性分配给新对象吗?你能添加一小段psuedo吗?
    猜你喜欢
    • 1970-01-01
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    • 2011-03-25
    • 2020-01-11
    • 1970-01-01
    相关资源
    最近更新 更多