如何在java中实现委托模式(如在objective-c中)

时间:2013-02-22 19:50:59

标签: java ios objective-c design-patterns delegates

我查看了一个示例,其中为java解释了委托模式。没有找到太多用处(原谅无知)因为我觉得它缺乏objective-c的灵活性。是否可以像在objective-c中那样动态设置委托对象。这不是代表团的全部意义吗?我对java的了解非常初步,所以请详细解释一下。

2 个答案:

答案 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();
  }
}