装饰器模式是一种结构型设计模式,它允许在运行时扩展一个对象的功能,而不需要改变其现有结构。这种模式的核心思想是通过创建一个包装类(装饰器)来动态地增强或修改原有对象的行为。
具体来说,装饰器模式的主要特点如下:
装饰器模式是一种结构型设计模式,它允许在运行时动态地扩展一个对象的功能,而不需要改变其现有结构。下面是一个简单的 Java 实现装饰器模式的示例:
首先,我们创建一个接口 Component:
public interface Component {
void operation();
}
然后,我们创建一个具体的组件类 ConcreteComponent:
public class ConcreteComponent implements Component {
@Override
public void operation() {
System.out.println("具体组件的操作");
}
}
接下来,我们创建一个抽象装饰器类 Decorator,它也实现了 Component 接口,并持有一个 Component 类型的对象:
public abstract class Decorator implements Component {
protected Component component;
public Decorator(Component component) {
this.component = component;
}
@Override
public void operation() {
component.operation();
}
}
现在,我们可以创建具体的装饰器类,例如 ConcreteDecoratorA 和 ConcreteDecoratorB,它们分别在原有功能的基础上添加新的功能:
public class ConcreteDecoratorA extends Decorator {
public ConcreteDecoratorA(Component component) {
super(component);
}
@Override
public void operation() {
System.out.println("装饰器 A 的操作");
super.operation();
}
}
public class ConcreteDecoratorB extends Decorator {
public ConcreteDecoratorB(Component component) {
super(component);
}
@Override
public void operation() {
System.out.println("装饰器 B 的操作");
super.operation();
}
}
最后,我们在客户端代码中使用装饰器模式:
public class Client {
public static void main(String[] args) {
Component component = new ConcreteComponent();
Component decoratorA = new ConcreteDecoratorA(component);
Component decoratorB = new ConcreteDecoratorB(decoratorA);
decoratorB.operation();
}
}
运行客户端代码,输出结果如下:
装饰器 B 的操作
装饰器 A 的操作
具体组件的操作
装饰器模式是一种结构型设计模式,它允许在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)。这种模式的核心在于创建一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
以下是装饰器模式的一些主要用途:
通过定义一个接口或抽象类,然后创建具体的装饰器类来实现装饰器模式。这种方式适用于需要动态添加功能的场景。
// 定义一个接口
public interface Component {
void operation();
}
// 定义一个具体组件
public class ConcreteComponent implements Component {
@Override
public void operation() {
System.out.println("具体组件的操作");
}
}
// 定义一个抽象装饰器类
public abstract class Decorator implements Component {
protected Component component;
public Decorator(Component component) {
this.component = component;
}
@Override
public void operation() {
component.operation();
}
}
// 定义一个具体装饰器类
public class ConcreteDecorator extends Decorator {
public ConcreteDecorator(Component component) {
super(component);
}
@Override
public void operation() {
super.operation();
addedFunction();
}
public void addedFunction() {
System.out.println("新增的功能");
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
Component component = new ConcreteComponent();
Component decorator = new ConcreteDecorator(component);
decorator.operation();
}
}
通过Java反射机制,可以在运行时动态地为对象添加新的功能。这种方式适用于需要根据条件动态改变行为的场景。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class DecoratorDemo {
public static void main(String[] args) {
MyInterface myInterface = (MyInterface) Proxy.newProxyInstance(
MyInterface.class.getClassLoader(),
new Class[]{MyInterface.class},
new DecoratorInvocationHandler(new MyInterfaceImpl()));
myInterface.doSomething();
}
}
interface MyInterface {
void doSomething();
}
class MyInterfaceImpl implements MyInterface {
@Override
public void doSomething() {
System.out.println("原始方法");
}
}
class DecoratorInvocationHandler implements InvocationHandler {
private Object target;
public DecoratorInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("装饰器开始执行");
Object result = method.invoke(target, args);
System.out.println("装饰器结束执行");
return result;
}
}
有一些第三方库提供了装饰器模式的实现,如Spring框架中的AOP(面向切面编程)模块。这些库通常提供了更加完善的功能和更好的性能。