我查看了一个示例,其中为java解释了委托模式。没有找到太多用处(原谅无知)因为我觉得它缺乏objective-c的灵活性。是否可以像在objective-c中那样动态设置委托对象。这不是代表团的全部意义吗?我对java的了解非常初步,所以请详细解释一下。
答案 0 :(得分:8)
我认为有很多方法可以在Java中实现委托模式,但可能没有一种方法可以像内置一样。
看看Wikipedia example。您的基本选项是手动实现界面,然后将调用转发到具体实例,您可以在运行时根据需要将其更改。
现在,根据您拥有和可以使用的工具,您可以更加自动地进行转发。一个想法是使用面向方面的编程,如AspectJ。
拥有方面编译器(或运行时),您可以使用注释并提出对该语言的简单扩展:
class Person {
@Delegate Animal animal;
...
}
然后,您必须编写一个查找@Delegate
的方面,并自动在类中添加转发方法(例如。Person
)接口。
如果您可以使用a more groovy JVM language,那么您甚至不需要编写一行代码,因为这些语言在标准库中有代理:
你可以看看here,看看它是如何在Groovy中完成的。 (完全类似于我提出的Person
示例语法...但内置!)
答案 1 :(得分: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();
}
}