【问题标题】:Design for converting objects with mirroring class hierarchy用于转换具有镜像类层次结构的对象的设计
【发布时间】:2015-10-16 02:47:21
【问题描述】:

我有一个返回多态对象的低级(即不能依赖更高级别的模块)MySQL DAO 包

abstract class MySQLAnimal {
    int a;
}

class MySQLCat extends MySQLAnimal {
    int b;
}

Collection<MySQLAnimal> retrieveAllMySQLAnimals(...) {...}

然后,我有这个包的消费者,它提供抽象(即它不知道如何检索它们)并包含具有镜像类层次结构的类:

abstract class Animal {
    int a;
}

class Cat extends Animal {
    int b;
}

Collection<Animal> retrieveAllAnimals(...) {...}

我正在尝试在这个消费者包中编写一个适配器,它需要使用 MySQL DAO 检索 MySQLCat 对象并以抽象类的形式返回它(即实现 retrieveAllAnimals(...) 方法)。什么是最干净的方式(阅读:无需致电instanceof)来做到这一点?

【问题讨论】:

  • 也许您可以简单地将抽象方法Animal toAnimal() 添加到MySQLAnimal?所有子类都将实现此方法,该方法将转换为适当的Animal 层次结构对象。
  • 在这种情况下通常推荐使用Visitor 模式。
  • 我感觉很奇怪,你需要一个完整的类层次结构来处理持久性问题。

标签: java oop design-patterns


【解决方案1】:

有一个从ClassClassHashMap。当一个对象进来时,从它自己的类中在HashMap 中查找它,然后实例化新类的一个对象并使用反射复制所有同名的成员变量。

未来支持新类所需的唯一更改是添加新映射,这些映射可以存储在配置文件中。

mapping.put(MySQLCat.class, Cat.class);

Class<? extends Animal> targetClass = mapping.get(objectToMap.getClass());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-21
    相关资源
    最近更新 更多