【问题标题】:Class derivation on the fly - Visitor Pattern动态类派生 - 访问者模式
【发布时间】:2011-06-20 11:54:50
【问题描述】:

我想以这种方式创建访问者模式

public interface Visitable<T>{
   public void accept(T visitor);
}

public interface SomeBusinessService implements Visitable<SomeVisitor>{

  public void mtd1();
  public void mtd2();
}

public abstract class SomeBusinessBean1 implements SomeBusinessService {
   public void mtd1(){}
   public void mtd2(){}
} 

public abstract class SomeBusinessBean2 implements SomeBusinessService {
   ...
}

等等

那我想创建一个工厂

public class SomeBusinessServiceFactory {
   public SomeBusinessService createService
                 (Class<? extends SomeBusinessService> clazz ){
      //do some stuff to create appropriate class derivation on the fly
     // that will have accept() method implemented 
   }
}

我可以通过以下方式调用它

SomeBusinessService  service = 
    SomeBusinessServiceFactory.createService(SomeBusinessBean1.class);

使用这种方法,我不必为所有的 bean 创建 comman 抽象类 实现访问者接口accept()方法。

此解决方案也可用于我们希望特定方法的共同行为取决于每个类层次结构的服务工厂的情况。

有什么方法可以用标准 jdk 做到这一点,或者我可能需要使用 cglib 之类的外部工具,或者我所说的可能是垃圾,我们可以通过其他方式实现这个目标。

高级发送

【问题讨论】:

  • 只是为了澄清:VisitorVisitable 是“相同的”,这是问题中的错字还是您有两个不同的界面?
  • 通常Visitor代表可以访问Visitable类的东西。
  • 对不起我的坏我ment实现了Visitable。访问者类将只有 visit() 方法,并将适当的类作为输入参数
  • 这不就是注释的用途吗?
  • 您希望如何通过注释来解决这个问题,因为我不完全理解它。我想要的是类层次结构中几种方法的常见行为,具体取决于工厂方法。因此,例如,如果我创建另一个工厂实现,它可以以其他方式实现抽象方法。所以会符合开闭原则。我想避免 if-else 驱动的开发。

标签: java derived-class visitor-pattern


【解决方案1】:

如果您正在寻找一种从类对象创建类实例的方法,请查看 java 反射 api。

clazz.newInstanze();

clazz.getConstructors(...).newInstance(...);

【讨论】:

  • 好吧,我不能这样做,因为我的派生是抽象类,这是我想动态创建匿名类的点,但我想确定应该在运行时而不是编译中扩展哪个类时间。
  • @Marcin Michalski 这个匿名类应该做什么?
  • 好吧,在这种特定情况下,匿名类是可访问的实现,没有实现不必要的类方法 accept()。我想实现与 EJB2.x 实体 bean 中类似的东西,其中实体 bean 的属性是抽象的 getter/setter,容器负责在部署期间扩展实体 bean 类。我已经开始阅读有关 ASM 库的信息,也许这会帮助我解决这个问题。结果,我最终可以得到一种机制,可以在运行时确定一组类层次结构的常见行为
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-02
  • 2018-07-14
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多