【Java设计模式系列】装饰器模式(Decorator Pattern)(上)

简介: 【Java设计模式系列】装饰器模式(Decorator Pattern)

简介

一般有两种方式可以给一个类或对象新增行为:


  • 继承
    子类在拥有自身方法同时还拥有父类方法。但这种是静态的,用户无法控制增加行为的方式和时机。
  • 关联
    将一个类的对象嵌入另一个对象,由另一个对象决定是否调用嵌入对象的行为以便扩展自身行为,这个嵌入的对象就叫做装饰器(Decorator)。


定义

对象结构型模式。

动态地给一个对象增加额外功能,装饰器模式比生成子类实现更为灵活。

装饰模式以对用户透明的方式动态给一个对象附加功能。用户不会觉得对象在装饰前、后有何不同。装饰模式可在无需创造更多子类情况下,扩展对象的功能。



角色


Component 接口: 抽象构件

定义了对象的接口,可以给这些对象动态增加功能


ConcreteComponent 具体类: 具体构件

定义了具体的构件对象,实现了 在抽象构件中声明的方法,装饰器可以给它增加额外的职责(方法)


Decorator 抽象类: 装饰类

抽象装饰类是抽象构件类的子类,用于给具体构件增加职责,但是具 体职责在其子类中实现;


ConcreteDecorator 具体类: 具体装饰类

具体装饰类是抽象装饰类的子类,负责向构 件添加新的职责。


image.pngimage.png

image.png


代码实例


窗口 接口

public interface Window {
  // 绘制窗口
  public void draw();
   // 返回窗口的描述
  public String getDescription();
}

无滚动条功能的简单窗口实现

public class SimpleWindow implements Window {
  @Override
  public void draw() {
    // 绘制窗口
  }
  @Override
  public String getDescription() {
    return "simple window";
  }
}

以下类包含所有Window类的decorator,以及修饰类本身。

//  抽象装饰类 注意实现Window接口
public abstract class WindowDecorator implements Window {
  // 被装饰的Window
    protected Window decoratedWindow;
    public WindowDecorator (Window decoratedWindow) {
        this.decoratedWindow = decoratedWindow;
    }
    @Override
    public void draw() {
        decoratedWindow.draw();
    }
    @Override
    public String getDescription() {
        return decoratedWindow.getDescription();
    }
}
// 第一个具体装饰器 添加垂直滚动条功能
public class VerticalScrollBar extends WindowDecorator {
  public VerticalScrollBar(Window windowToBeDecorated) {
    super(windowToBeDecorated);
  }
  @Override
  public void draw() {
    super.draw();
    drawVerticalScrollBar();
  }
  private void drawVerticalScrollBar() {
    // Draw the vertical scrollbar
  }
  @Override
  public String getDescription() {
    return super.getDescription() + ", including vertical scrollbars";
  }
}
// 第二个具体装饰器 添加水平滚动条功能
public class HorizontalScrollBar extends WindowDecorator {
  public HorizontalScrollBar (Window windowToBeDecorated) {
    super(windowToBeDecorated);
  }
  @Override
  public void draw() {
    super.draw();
    drawHorizontalScrollBar();
  }
  private void drawHorizontalScrollBar() {
    // Draw the horizontal scrollbar
  }
  @Override
  public String getDescription() {
    return super.getDescription() + ", including horizontal scrollbars";
  }
}
目录
相关文章
|
3月前
|
设计模式 XML Java
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
41 0
|
20天前
|
设计模式 前端开发 JavaScript
前端必须掌握的设计模式——装饰器模式
装饰器模式是一种结构型设计模式,通过创建新类来包装原始对象,实现在不修改原有结构的前提下扩展新行为。其核心在于“组合”思想,使新功能可“即插即拔”。该模式具有解耦性、灵活性和动态性等特点,广泛应用于类的面向对象编程语言中,如JavaScript的注解和TypeScript的写法。示例中,通过装饰器模式为游戏角色动态添加装备,展示了其强大的扩展性和灵活性。
|
2月前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
2月前
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
40 4
|
3月前
|
设计模式 Java 程序员
[Java]23种设计模式
本文介绍了设计模式的概念及其七大原则,强调了设计模式在提高代码重用性、可读性、可扩展性和可靠性方面的作用。文章还简要概述了23种设计模式,并提供了进一步学习的资源链接。
57 0
[Java]23种设计模式
|
2月前
|
设计模式 JavaScript Java
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。
|
3月前
|
设计模式 监控 算法
Java设计模式梳理:行为型模式(策略,观察者等)
本文详细介绍了Java设计模式中的行为型模式,包括策略模式、观察者模式、责任链模式、模板方法模式和状态模式。通过具体示例代码,深入浅出地讲解了每种模式的应用场景与实现方式。例如,策略模式通过定义一系列算法让客户端在运行时选择所需算法;观察者模式则让多个观察者对象同时监听某一个主题对象,实现松耦合的消息传递机制。此外,还探讨了这些模式与实际开发中的联系,帮助读者更好地理解和应用设计模式,提升代码质量。
Java设计模式梳理:行为型模式(策略,观察者等)
|
3月前
|
设计模式 Java
Java设计模式
Java设计模式
39 0
|
7月前
|
设计模式 缓存 安全
Java设计模式的单例模式应用场景
Java设计模式的单例模式应用场景
73 4
|
4月前
|
设计模式 安全 Java
Java 编程中的设计模式:单例模式的深度解析
【9月更文挑战第22天】在Java的世界里,单例模式就像是一位老练的舞者,轻盈地穿梭在对象创建的舞台上。它确保了一个类仅有一个实例,并提供全局访问点。这不仅仅是代码优雅的体现,更是资源管理的高手。我们将一起探索单例模式的奥秘,从基础实现到高级应用,再到它与现代Java版本的舞蹈,让我们揭开单例模式的面纱,一探究竟。
48 11