【问题标题】:How to implement delegate pattern (like in objective-c ) in java如何在java中实现委托模式(如在objective-c中)
【发布时间】:2013-02-22 19:50:59
【问题描述】:

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

【问题讨论】:

  • Java AWT Event architecture 采用委托模型。您可能希望阅读该链接文档。
  • @Perception:我检查了链接。在给出的代码示例中,传递的委托不一定必须是“App”类型。这就是我所说的灵活性。还是我完全错误地认为 App 对象是委托?
  • 前几天这里stackoverflow.com/questions/14963740/cast-to-implemented-class/…我用一个例子勾勒了委托模式,你可以看看。
  • @Rakesh,如果您在这种情况下将App 视为委托协议(它不准确,但足够接近),它会有所帮助。您会发现 Java AWT 事件模型使用了很多接口(@98​​7654324@、WindowListenerButtonListener 等)。这些基本上是 Objective-C 委托通常遵循的协议。
  • 我的回答对你有帮助吗?

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


【解决方案1】:

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

看看Wikipedia example。您的基本选择是手动实现接口,然后简单地将调用转发到具体实例,您可以在运行时随意更改。 p>

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

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

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

然后你必须编写一个切面来找到@Delegates 并在类的(例如Person)接口中自动添加转发方法。

如果您能够使用a more groovy JVM language,那么您甚至不必编写一行代码,因为此类语言在标准库中有委托:

您可以查看here,了解它是如何在 Groovy 中完成的。 (本质上与我想出的Person 示例语法一模一样……但内置!)

【讨论】:

    【解决方案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();
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-07
      • 1970-01-01
      • 2010-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多