【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";
  }
}
目录
相关文章
|
1月前
|
设计模式 XML Java
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
33 0
|
26天前
|
设计模式 Java 程序员
[Java]23种设计模式
本文介绍了设计模式的概念及其七大原则,强调了设计模式在提高代码重用性、可读性、可扩展性和可靠性方面的作用。文章还简要概述了23种设计模式,并提供了进一步学习的资源链接。
43 0
[Java]23种设计模式
|
10天前
|
设计模式 JavaScript Java
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。
|
1月前
|
设计模式 监控 算法
Java设计模式梳理:行为型模式(策略,观察者等)
本文详细介绍了Java设计模式中的行为型模式,包括策略模式、观察者模式、责任链模式、模板方法模式和状态模式。通过具体示例代码,深入浅出地讲解了每种模式的应用场景与实现方式。例如,策略模式通过定义一系列算法让客户端在运行时选择所需算法;观察者模式则让多个观察者对象同时监听某一个主题对象,实现松耦合的消息传递机制。此外,还探讨了这些模式与实际开发中的联系,帮助读者更好地理解和应用设计模式,提升代码质量。
Java设计模式梳理:行为型模式(策略,观察者等)
|
1月前
|
设计模式 Java
Java设计模式
Java设计模式
28 0
|
1月前
|
设计模式 Java
Java设计模式之外观模式
这篇文章详细解释了Java设计模式之外观模式的原理及其应用场景,并通过具体代码示例展示了如何通过外观模式简化子系统的使用。
29 0
|
1月前
|
设计模式 Java
Java设计模式之桥接模式
这篇文章介绍了Java设计模式中的桥接模式,包括桥接模式的目的、实现方式,并通过具体代码示例展示了如何分离抽象与实现,使得两者可以独立变化。
44 0
|
1月前
|
设计模式 Java
Java设计模式之适配器模式
这篇文章详细讲解了Java设计模式中的适配器模式,包括其应用场景、实现方式及代码示例。
44 0
|
12天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
8天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
30 9
下一篇
无影云桌面