写点什么

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

作者:Java高工P7
  • 2021 年 11 月 11 日
  • 本文字数:1382 字

    阅读完需:约 5 分钟

角色


=================================================================


  • Component 接口: 抽象构件


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


  • ConcreteComponent 具体类: 具体构件


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


  • Decorator 抽象类: 装饰类


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


  • ConcreteDecorator 具体类: 具体装饰类


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



代码实例


===================================================================


窗口 接口


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";


}


}


mybatis 示例






![](https://img-blog.csdnimg.cn/ad240de49e644ef18589efa03b2b94ec.png?


【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzNTg5NTEw,size_16,color_FFFFFF,t_70)


优点


=================================================================


使用装饰模式来实现扩展比继承更加灵活,它以对客户透明的方式动态地给一个对象附加更多的责任。装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展。


与继承相比,关联关系的优势在于不破坏类的封装性,而且继承是一种耦合度较大的静态关系,无法在程序运行时动态扩展。

用户头像

Java高工P7

关注

还未添加个人签名 2021.11.08 加入

还未添加个人简介

评论

发布
暂无评论
【Java设计模式系列】装饰器模式(Decorator Pattern)