7

我查看了一个为 java 解释委托模式的示例。没有发现它有多大用处(请原谅我的无知),因为我觉得它在 Objective-c 中缺乏灵活性。有没有办法像在objective-c中那样动态设置委托对象。这不就是委托的全部意义吗?我对java的了解很初步,所以请详细解释一下。

4

2 回答 2

9

我认为有很多方法可以在 Java 中实现委托模式,但可能没有一种方法感觉像是内置的。

看看维基百科的例子。您的基本选择是手动实现一个接口,然后简单地将调用转发到一个具体实例,您可以在运行时随意更改该实例。

现在,根据您拥有和可以使用的工具,您可以使此转发更加自动化。一个想法是使用面向方面的编程,例如 AspectJ。

拥有一个方面编译器(或运行时),您可以利用注释并为该语言提供一个简单的扩展:

class Person {
  @Delegate Animal animal;
  ...
}

然后,您必须编写一个方面来查找s 并在类的(例如)接口@Delegate中自动添加转发方法。Person

如果您能够使用更 groovy 的 JVM 语言,那么您甚至不必编写一行代码,因为这些语言在标准库中有委托:

你可以看看这里,看看它是如何在 Groovy 中完成的。(本质Person上与我想出的示例语法完全一样......但内置!)

于 2013-02-22T20:51:35.153 回答
2

这就是你在 Java 中伪造函数式惯用语的方式。是的,这很可怕。如果您想要优雅的函数式惯用语,请使用一种不会将函数视为红头发继子的语言。如果您想要更多的编译时安全性,您当然可以使用更具体的接口定义,这样您就不会因为编程错误而到处出现 IndexOutOfBounds 和 ClassCastException。

public interface DelegatedFunction<T> {

T call(Object... args);

}

public class DoesSomeDelegatedTask {

  private List<DelegatedFunction<String>> delegatedFunctions = new ArrayList<>(1);

  public void addFunction(DelegatedFunction<String> function) {
    delegatedFunctions.add(function);
  }

  public void execute() {
    for (DelegatedFunction<String> function: delegatedFunctions) {
      System.out.println(function(something, someotherthing, whatever));
    }
  }
}

public class Main {
  public static void main(String[] args) throws Exception {
    DoesSomeDelegateTask doer = new DoesSomeDelegatedTask();
    doer.addFunction(new DelegatedFunction<String> () {
      @Override
      public String call(Object... args) {
        return ((SomeThings) args[0]).whatever((SomeOtherThing) args[1]//you get the idea
      }
    }
    doer.execute();
  }
}
于 2013-02-22T21:44:39.837 回答