IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 设计模式之装饰者模式 -> 正文阅读

[Java知识库]设计模式之装饰者模式

设计模式之装饰者模式

装饰者模式: 动态地给一个对象装饰些额外的功能.



一、装饰者模式是什么?

装饰者模式是动态地给一个对象装饰些额外的功能,若要扩展功能,装饰者提供了比继承更有弹性的替代方案,比生成子类更加灵活。

通常在继承关系中,为了扩展功能需要新增子类进行扩展,而装饰者模式,可以在不扩展子类的情况下,将对象的功能进行动态的扩展。

装饰者模式类图如下:
在这里插入图片描述
抽象构件(Component): 给出一个抽象接口,以规范接收附加功能的对象。
具体构件(ConcreteComponent): 定义一个将要接收附加功能的类。
装饰者(Decorat): 持有一个构件对象的实例,并定义一个与构件接口一致的接口。
具体装饰者(ConcretDecorat1,ConcretDecorat2): 负责给构件对象添加附加的功能。
测试类(DecoratTest): 测试装饰是否成功。

二、具体代码

1.Component类

代码如下(示例):

/**
 * 抽象构件
 */
public abstract class Component {
  public abstract void operate();
}

2.ConcreteComponent类

代码如下(示例):

/**
 * 具体构件
 */
public class ConcreteComponent extends Component {
  @Override
  public void operate() {
    System.out.println("具体构件");
  }
}

3.Decorat类

代码如下(示例) :

/**
 * 装饰者
 */
public abstract class Decorat extends Component {
  private Component component;

  public Decorat(Component component){
    this.component = component;
  }

  @Override
  public void operate() {
    component.operate();
  }
}

4.ConcretDecorat类

代码如下(示例) :

/**
 * 具体装饰者1
 */
public class ConcreteDecorat1 extends Decorat {

  public ConcreteDecorat1(Component component) {
    super(component);
  }
  private void method1(){
    System.out.println("装饰方法1");
  }

  @Override
  public void operate() {
    method1();
    super.operate();
  }
}
/**
 * 具体装饰者2
 */
public class ConcreteDecorat2 extends Decorat {

  public ConcreteDecorat2(Component component) {
    super(component);
  }
  private void method1(){
    System.out.println("装饰方法2");
  }

  @Override
  public void operate() {
    method1();
    super.operate();
  }
}

5.DecoratTest类

代码如下(示例) :

/**
 * @author haowu
 * @create 2021-09-25-21:41
 * @Description 测试类
 */
public class DecoratTest {
    @Test
    public void testDecorat() {
        Component concreteComponent = new ConcreteComponent();
        concreteComponent = new ConcreteDecorat1(concreteComponent);
        concreteComponent = new ConcreteDecorat2(concreteComponent);
        concreteComponent.operate();
    }
}

运行结果

在这里插入图片描述


总结

通过测试类,我们可以看到,客户端可以随意进行功能的添加,由客户端进行动态的执行放入的顺序,每个人放入的顺序不同,通过装饰者模式可以进行不同的组装来完成需求的变更。

装饰模式允许系统动态决定增加一个需要的“装饰”,或者除掉一个不需要的“装饰”。继承关系则不同,继承关系是静态的,它在系统运行前就决定了。通过使用不同的具体装饰类以及这些装饰类的排列组合,就可以创造出很多不同行为的组合。

注: 文字解释部分参考于https://zhuanlan.zhihu.com/p/65113766

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-12-15 18:08:21  更:2021-12-15 18:10:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:21:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码