装饰器模式是一种强大的设计模式,属于结构型模式。它允许在不修改原始类代码的情况下增加新功能。通过使用装饰器模式,可以在运行时动态地将额外的功能添加到对象上,而无需修改其源代码。这种模式通常用于实现一些通用的、可复用的功能,例如日志记录、性能度量等。装饰器模式的核心思想是将被装饰的对象和装饰器之间的耦合关系降到最低,使得它们可以独立地变化和扩展。
装饰器模式是一种结构型设计模式,它允许我们在运行时动态地将责任附加到对象上,从而使对象具有新的功能,这种模式的主要目的是在不修改原始类代码的情况下,通过使用继承和组合的方式来扩展对象的功能。
装饰器模式的核心思想是将对象的职责划分为三个部分:基础接口、具体实现和装饰器,基础接口定义了所有装饰器都必须实现的方法,具体实现类实现了基础接口,并提供了具体的业务逻辑,装饰器则是一个实现了基础接口的新类,它可以添加额外的功能,但不会影响到其他部分的代码。
下面我们通过一个简单的例子来说明装饰器模式的用法:
假设我们有一个计算圆的面积的函数calculateArea
,它的输入参数是一个表示半径的整数,现在我们需要在不修改calculateArea
函数的情况下,为其添加一个计算圆的周长的装饰器。
我们定义一个基础接口Circle
,它包含一个计算面积的方法calculateArea
和一个计算周长的方法calculatePerimeter
:
public interface Circle { int calculateArea(); int calculatePerimeter(); }
我们创建一个具体的实现类CircleImpl
,它实现了Circle
接口,并提供了具体的业务逻辑:
public class CircleImpl implements Circle { private int radius; public CircleImpl(int radius) { this.radius = radius; } @Override public int calculateArea() { return Math.PI * radius * radius; } @Override public int calculatePerimeter() { return 2 * Math.PI * radius; } }
我们创建一个装饰器类CircleDecorator
,它实现了Circle
接口,并包含了一个Circle
类型的对象作为成员变量,装饰器类通过调用被装饰对象的calculateArea
方法来计算圆的面积,并在其基础上添加计算周长的功能:
public class CircleDecorator implements Circle { private Circle circle; public CircleDecorator(Circle circle) { this.circle = circle; } @Override public int calculateArea() { int area = circle.calculateArea(); int perimeter = circle.calculatePerimeter(); return (area + perimeter) * 0.1; // 在面积的基础上增加10%的周长 } @Override public int calculatePerimeter() { return circle.calculatePerimeter(); // 不改变周长计算结果,仅增加面积计算结果中包含周长的部分 } }
我们在客户端代码中使用装饰器模式为calculateArea
函数添加计算周长的装饰器:
public class Client { public static void main(String[] args) { Circle circle = new CircleImpl(5); // 一个半径为5的圆 Circle decoratedCircle = new CircleDecorator(circle); // 为圆添加计算周长的装饰器 System.out.println("圆的面积:" + decoratedCircle.calculateArea()); // 输出圆的面积,其中包含了周长的计算结果 } }