装饰模式是一种结构型设计模式,它允许你向一个对象添加新的功能,而无需修改原始类的代码。通过将对象包装在一个装饰器类中,你可以在运行时动态地添加、修改或删除对象的行为。
装饰模式基于组合而非继承的原则,它的核心思想是通过创建一个装饰器类来包装原始对象,并使得装饰器类具有与原始对象相同的接口。这样一来,你可以根据需要将一个或多个装饰器类串联起来,逐层地装饰对象,从而实现一种灵活的行为扩展机制。
装饰模式是一种结构型设计模式,其主要目的是在不改变原有对象的结构的情况下,动态地给对象添加职责。装饰模式通过将对象包装在装饰器对象中,以此来增强原有对象的功能。
优点:
缺点:
扩展一个类的功能或者给一个类添加附加职责。
动态地给一个对象添加功能,这些功能可以在运行时动态地进行添加、撤销。
需要为一组类提供一些额外的公共行为,而不影响这些类的结构。
需要在不影响其他对象的情况下,以动态、透明的方式给对象添加功能。
需要给对象添加一些额外的行为,但是使用继承来实现会导致类的个数急剧增加。
需要在不改变已有代码的情况下,对现有对象的功能进行动态扩展。
首先,我们定义一个接口 Shape,表示形状:
- public interface Shape {
- void draw();
- }
然后,我们实现该接口的具体类 Circle:
- public class Circle implements Shape {
- @Override
- public void draw() {
- System.out.println("Drawing a circle");
- }
- }
接下来,我们定义一个抽象装饰类 ShapeDecorator,它实现了 Shape 接口,并包含一个对 Shape 对象的引用:
- public abstract class ShapeDecorator implements Shape {
- protected Shape decoratedShape;
-
- public ShapeDecorator(Shape decoratedShape) {
- this.decoratedShape = decoratedShape;
- }
-
- public void draw() {
- decoratedShape.draw();
- }
- }
然后,我们实现具体的装饰类 RedShapeDecorator,它继承自 ShapeDecorator,并可以在原始形状的基础上添加额外的功能:
- public class RedShapeDecorator extends ShapeDecorator {
- public RedShapeDecorator(Shape decoratedShape) {
- super(decoratedShape);
- }
-
- @Override
- public void draw() {
- decoratedShape.draw();
- setRedBorder();
- }
-
- private void setRedBorder() {
- System.out.println("Border color: Red");
- }
- }
最后,我们可以使用装饰模式来扩展现有的 Circle 类:
- public class Main {
- public static void main(String[] args) {
- Shape circle = new Circle();
- Shape redCircle = new RedShapeDecorator(new Circle());
- Shape redRectangle = new RedShapeDecorator(new Rectangle());
-
- System.out.println("Circle with normal border:");
- circle.draw();
-
- System.out.println("\nCircle with red border:");
- redCircle.draw();
-
- System.out.println("\nRectangle with red border:");
- redRectangle.draw();
- }
- }
运行结果如下:
- Circle with normal border:
- Drawing a circle
-
- Circle with red border:
- Drawing a circle
- Border color: Red
-
- Rectangle with red border:
- Drawing a rectangle
- Border color: Red
在上面的示例中,我们创建了一个 Circle 对象,并使用 RedShapeDecorator 对象对它进行装饰。这样,我们就在原始的 Circle 类的基础上,添加了一个红色边框的功能。同样的方法也适用于其他形状,比如 Rectangle。
装饰模式是一种结构型设计模式,它允许你通过将对象包装在一个装饰器中来动态地修改对象的行为。装饰器的接口必须与其所装饰的对象的接口一致,这样它才能透明地传递给客户端。
在装饰模式中,有一个通用的接口,用于装饰器和原始对象之间的交互。装饰器和原始对象都实现了该接口,并且装饰器内部通常会持有一个指向原始对象的引用。
装饰器可以通过在调用原始对象的方法前后添加额外的功能来扩展原始对象的行为。这种方式不仅能够在不改变原始对象代码的情况下添加新功能,还可以在运行时动态地添加或移除装饰器。
装饰模式的优点包括:可以在不修改原始对象代码的情况下增加新的功能;可以动态地添加或移除装饰器;装饰器可以透明地传递给客户端,客户端无需知道其使用的是装饰器还是原始对象。
装饰模式的缺点包括:由于装饰器和原始对象都实现了相同的接口,所以装饰器的数量可能会增加,导致类的数量增加;装饰器的排列组合可能会变得复杂,影响代码的可读性。
适用场景: