java - java中的继承和委托(delegate)有什么区别

标签 java

<分区>

Possible Duplicate:
Prefer composition over inheritance?

java中继承和委托(delegate)有什么区别?

如何在我的项目中使用下面的例子?请你带我去代表团。我知道继承,但对委托(delegate)了解不多。所以,请给一个适当的理由。我为什么要使用它?

 package com.m;

 class RealPrinter { // the "delegate"
     void print() { 
      System.out.println("something"); 
    }
 }

 class Printer { // the "delegator"
     RealPrinter p = new RealPrinter(); // create the delegate 
     void print() { 
     p.print(); // delegation
     } 
 }

 public class Tester {

// to the outside world it looks like Printer actually prints.
     public static void main(String[] args) {
        Printer printer = new Printer();
        printer.print();
     }

   }

最佳答案

当你委托(delegate)时,你只是在调用一些知道必须做什么的类。您并不真正关心如何它是如何做到的,您关心的只是您调用的类知道需要做什么。

如果我是你,我会制作一个接口(interface)并将其命名为 IPrinter(或类似的名称),其中有一个名为 print 的方法。然后我会让 RealPrinter 实现这个接口(interface)。最后,我会将这一行:RealPrinter p = new RealPrinter(); 更改为:IPrinter p = new RealPrinter()

既然 RealPrinter 实现了 IPrinter,那么我肯定知道它有一个 print 方法。然后,我可以使用此方法通过将其委托(delegate)给适当的类来更改我的应用程序的打印行为。

这通常允许更大的灵 active ,因为您没有将行为嵌入到您的特定类中,而是将其留给另一个类。

在这种情况下,要更改应用程序的打印行为,您只需创建另一个实现 IPrinter 的类,然后更改此行:IPrinter p = new RealPrinter ();IPrinter p = new MyOtherPrinter();

public interface IPrinter {
    void print();
}

public class RealPrinter implements IPrinter {

    @Override
    public void print() {
        System.out.println("This is RealPrinter");
    }
}

public class RealPrinter2 implements IPrinter {

    @Override
    public void print() {
        System.out.println("This is RealPrinter2");
    }
}

public class Main {

    public static void main(String...arg){
        IPrinter printer  = new RealPrinter();
        printer.print();

        printer = new RealPrinter2();
        printer.print();
    }
}

关于java - java中的继承和委托(delegate)有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13245610/

相关文章:

java - 如何在java应用程序中设置垂直选取框?

java - Cassandra 集群性能不佳

java - Spring 安全 : method to check if a user has a Hierarchical Role

Java 语法 : NonWildcardTypeArguments

java - 基于正则表达式的替换效率

java - 更改抽屉导航

java - 在linux中的另一个用户下运行ProcessBuilder

Java GUI 布局不太正确

java - 使用 Java 从 Microsoft 邮件 Exchange 服务器读取带有附件的邮件

java - OpenGL 旋转框