Java中有两种常见的设计模式,分别是装饰模式和适配器模式。这两种模式在实际应用中,往往会被误解为替代品或者类似品,其实它们之间是有着根本的区别的。
首先我们来看看装饰模式。装饰模式就是在不改变原有对象的基础上,给对象添加新的方法,或者改变原有的方法,是一种结构型的模式。在Java中,装饰模式主要使用了继承的概念,通过子类继承父类的方式来达到动态拓展的目的。下面是一个简单的装饰模式的实例:
public interface Component { void operation(); } public class ConcreteComponent implements Component { 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 ConcreteDecoratorA extends Decorator { public ConcreteDecoratorA(Component component) { super(component); } public void operation() { super.operation(); System.out.println("ConcreteDecoratorA operation!"); } } public class Client { public static void main(String[] args) { Component component = new ConcreteComponent(); Decorator decoratorA = new ConcreteDecoratorA(component); decoratorA.operation(); } }
接下来,我们来看看适配器模式。适配器模式是将不兼容的接口转换为兼容的接口。在Java中,适配器模式主要使用了组合的概念,通过引入一个新的接口来适配原有接口。下面是一个简单的适配器模式的实例:
public interface Target { void method1(); } public class Adaptee { public void method2() { System.out.println("Adaptee method2!"); } } public class Adapter implements Target { private Adaptee adaptee; public Adapter(Adaptee adaptee) { this.adaptee = adaptee; } public void method1() { adaptee.method2(); System.out.println("Adapter method1!"); } } public class Client { public static void main(String[] args) { Adaptee adaptee = new Adaptee(); Target adapter = new Adapter(adaptee); adapter.method1(); } }
从上面的两个实例可以看出,装饰模式主要使用了继承的方式来扩展原有对象,而适配器模式主要使用了组合的方式来使得原来不兼容的接口变得兼容。