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