设计模式(结构型模式)装饰器模式

本文介绍了装饰器模式的工作原理,包括组件、具体组件、抽象装饰器类和具体装饰器实现,展示了如何在运行时动态添加颜色功能。文章还讨论了装饰器模式的优点(如动态性、灵活性和开闭原则)以及可能的缺点(如对象增多和装饰层次固定)。
摘要由CSDN通过智能技术生成

一、简介

  装饰器模式是一种结构型设计模式,它允许向现有对象动态地添加新功能,同时又不改变其结构。它通过创建包装对象来包裹原始类,在不改变其接口的情况下,为对象添加新的行为或责任。

装饰器模式通常包含以下角色:

  • Component(组件) :定义了一个对象接口,可以动态地添加新的功能。
  • ConcreteComponent(具体组件) :实现了组件接口,是被装饰的类。
  • Decorator(装饰器抽象类) :实现了组件接口,并持有一个对组件对象的引用,在其内部包装组件对象,可以动态地为组件添加新的功能。
  • ConcreteDecorator(具体装饰器类) :继承自装饰器抽象类,具体实现了装饰功能,可以添加具体的行为。

二、装饰器模式

2.1、组件信息

  假设我们有一个形状的接口,它有一个画形状的方法

public interface Shape {
    // 画一个形状
    void draw();
}

2.2、具体组件信息

  圆形组件和方形组件实现了上面的接口,代码如下:

// 具体的形状类 - 圆形
public class Circle implements Shape {
    public void draw() {
        System.out.println("画了一个圆形:Circle");
    }
}

// 具体的形状类 - 方形
public class Square implements Shape {
    public void draw() {
        System.out.println("画了一个方形:Square");
    }
}

2.3、颜色装饰器抽象类

// 装饰器抽象类
abstract class ColorDecorator implements Shape {

    protected Shape decoratedShape;
    protected String color;

    public ColorDecorator(Shape decoratedShape, String color) {
        this.decoratedShape = decoratedShape;
        this.color = color;
    }

    public void draw() {
        decoratedShape.draw();
        System.out.println("装饰一个颜色: " + color);
    }
}

2.4、颜色装饰器实现类

// 圆形颜色装饰器
public class CircleColorDecorator extends ColorDecorator {
    public CircleColorDecorator(Shape decoratedShape, String color) {
        super(decoratedShape, color);
    }
}

// 方形颜色装饰器
public class SquareColorDecorator extends ColorDecorator {
    public SquareColorDecorator(Shape decoratedShape, String color) {
        super(decoratedShape, color);
    }
}

三、使用

3.1、测试

public class DecoratorPatternExample {
    public static void main(String[] args) {
        System.out.println("---------------------基础形状-------------------------");
        // 创建基础圆形
        Shape circle = new Circle();
        circle.draw();
        // 创建基础方形
        Shape square = new Square();
        square.draw();

        System.out.println("---------------------圆形形状(带颜色)-------------------------");
        // 装饰成红色的圆形
        Shape redCircle = new CircleColorDecorator(new Circle(),"red");
        redCircle.draw();
        // 装饰成蓝色的圆形
        Shape blueCircle = new CircleColorDecorator(new Circle(),"blue");
        blueCircle.draw();

        System.out.println("---------------------方形形状(带颜色)-------------------------");
        // 装饰成红色的圆形
        Shape redSquare = new SquareColorDecorator(new Square(),"red");
        redSquare.draw();
        // 装饰成蓝色的方形
        Shape blueSquare = new SquareColorDecorator(new Square(),"blue");
        blueSquare.draw();
    }
}

运行结果:

---------------------基础形状-------------------------
画了一个圆形:Circle
画了一个方形:Square
---------------------圆形形状(带颜色)-------------------------
画了一个圆形:Circle
装饰一个颜色: red
画了一个圆形:Circle
装饰一个颜色: blue
---------------------方形形状(带颜色)-------------------------
画了一个方形:Square
装饰一个颜色: red
画了一个方形:Square
装饰一个颜色: blue

3.2、优缺点

优点:

  • 动态性 : 可以动态地添加或移除对象的功能,不需要修改已有代码。
  • 灵活性 : 可以通过不同的装饰器组合来实现不同的效果,使得扩展变得更加灵活。
  • 遵循开闭原则 : 装饰器模式允许在不修改现有代码的情况下,扩展对象的功能,符合开闭原则。

缺点:

  • 过多的对象 : 可能会导致系统中出现大量的具体装饰器类,增加了对象数量,使得代码复杂性增加。
  • 固定装饰层次 : 当装饰器层次固定时,对于动态地添加新功能有一定的限制,因为需要预先定义好不同的装饰器组合。

  总的来说,装饰器模式是一种灵活且可扩展的模式,它允许在运行时动态地添加新功能,而无需改变现有对象的结构,这使得代码更具灵活性和可维护性。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值