Java中,装饰者模式和代理模式都是常见的设计模式,它们经常被用于增强对象或者限制对象的某些行为。下面我们分别来介绍一下这两种模式。
装饰者模式(Decorator Pattern)是指动态地将责任附加到对象上。在运行时,可在不改变原始类的情况下,将对象的某些行为赋予其他类来扩展功能。
// 抽象组件 public interface Component { void operation(); } // 具体组件 public class ConcreteComponent implements Component { @Override public void operation() { System.out.println("ConcreteComponent.operation()"); } } // 抽象装饰类 public abstract class Decorator implements Component { private Component component; public Decorator(Component component) { this.component = component; } public void operation() { component.operation(); } } // 具体装饰类 public class ConcreteDecorator extends Decorator { public ConcreteDecorator(Component component) { super(component); } public void operation() { super.operation(); System.out.println("ConcreteDecorator.operation()"); } }
代理模式(Proxy Pattern)是指通过代理对象控制对原始对象的访问。代理对象可以拦截对原始对象的访问,从而在真正访问原始对象前或者后执行一些预处理或者后置处理。
// 抽象主题类 public interface Subject { void request(); } // 真正的主题类 public class RealSubject implements Subject { @Override public void request() { System.out.println("RealSubject.request()"); } } // 代理类 public class Proxy implements Subject { private Subject subject; public Proxy(Subject subject) { this.subject = subject; } @Override public void request() { System.out.println("Proxy.request() - before the real operation"); subject.request(); System.out.println("Proxy.request() - after the real operation"); } }
通过上面的代码示例,我们可以看到装饰者模式和代理模式都是通过在运行时动态地扩展对象的功能或者控制对对象的访问。装饰者模式通过增加装饰对象来扩展原始对象的功能,而代理模式则通过代理对象来限制或者增强对原始对象的访问。