在Java编程中,代理和委托是两个非常常见的设计模式,它们都是用来解决对象之间的协作问题的。虽然它们的作用有些相似,但是它们之间有着明显的区别。
首先,我们来看一下代理模式。
public interface Subject { public void request(); } public class RealSubject implements Subject { public void request() { System.out.println("真实的请求"); } } public class Proxy implements Subject { private Subject realSubject; public void request() { if (realSubject == null) { realSubject = new RealSubject(); } preRequest(); realSubject.request(); postRequest(); } public void preRequest() { System.out.println("预处理"); } public void postRequest() { System.out.println("后处理"); } }
上面的代码演示了一个最简单的代理模式。其中,主题接口代表了被代理者和代理者的公共职责,真实主题是被代理者,代理是代理者。代理中维护了一个真实主题的引用,通过条件判断是否需要创建真实主题,并在调用前后进行预处理和后处理。
那么,什么是委托呢?
public interface Print { public abstract void print(); } public class RealPrinter implements Print { public void print() { System.out.println("真正的打印"); } } public class PrinterDelegate { private final Print print; public PrinterDelegate(Print print) { this.print = print; } public void print() { print.print(); } }
上述代码演示了委托模式。其中,打印接口表示被委托者的职责,真实打印者是被委托者,委托者是委托方。委托者持有被委托者引用并调用其方法,实现将委托者的任务交由被委托者完成。
那么它们之间的区别是什么呢?代理模式强调的是控制对象的访问,代理者可以对被代理者加以控制;委托模式强调的是对象间的合作,委托可以将任务交由不同的对象完成,而不需要控制其访问。因此,代理模式是一种结构型模式,而委托模式是一种行为型模式。