Java装饰简单方法

时间:2010-07-01 17:30:13

标签: java algorithm decorator

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

List<LegacyObject> getImportantThingFromDatabase(Criteria c);

图像传统对象有大量字段,您希望对其进行扩展,以便更容易获取某些信息:

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

但是,您不能只是转换为ImprovedLegacyObject,即使字段完全相同且您没有更改任何底层代码,您也只是添加了它以便代码使用LegacyObject仍然有效,但新代码更容易编写。

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

来说速度不够快 编辑:静态方法有什么用吗?装饰现有对象?

2 个答案:

答案 0 :(得分:1)

如何为改进的旧对象制作一个复制构造函数,该复制构造函数将Legacy Object作为参数。然后只需从旧的对象中创建新对象。

答案 1 :(得分: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
}