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