10-Java装饰器模式 ( Decorator Pattern )

news2024/12/23 17:03:35

Java装饰器模式

    • 摘要
    • 实现
    • 范例

  • 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构

  • 装饰器模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能

装饰器模式属于结构型模式,它是作为现有的类的一个包装

摘要

1. 意图

动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活

2. 主要解决

一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀

3. 何时使用

  • 在不想增加很多子类的情况下扩展类

4. 如何解决

将具体功能职责划分,同时继承装饰者模式

5. 关键代码

  • Component类充当抽象角色,不应该具体实现;
  • 修饰类引用和继承Component类,具体扩展类重写父类方法;

6. 应用实例

  • 孙悟空有72变,当他变成”庙宇”后,他的根本还是一只猴子,但是他又有了庙宇的功能;
  • 不论一幅画有没有画框都可以挂在墙上,但是通常都是有画框的,并且实际上是画框被挂在墙上在挂在墙上之前,画可以被蒙上玻璃,装到框子里;这时画、玻璃和画框形成了一个物体;

7. 优点

  • 装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能

8. 缺点

  • 多层装饰比较复杂

9. 使用场景

  • 扩展一个类的功能;
  • 动态增加功能,动态撤销;

10. 注意事项

  • 可代替继承

实现

在这里插入图片描述

  1. 创建一个Shape接口和实现了Shape接口的实体类;
  2. 创建一个实现了Shape接口的抽象装饰类ShapeDecorator,并把Shape对象作为它的实例变量;
  3. 创建类RedShapeDecorator实现了ShapeDecorator实体类;
  4. 创建类DecoratorPatternDemo使用RedShapeDecorator来装饰Shape对象;

范例

我们通过下面的范例来演示装饰器模式的用法,其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类

1.创建一个接口.

Shape.java

package com.demo.gof;
public interface Shape {
   void draw();
}

2. 创建实现接口的实体类

Rectangle.java

package com.demo.gof;
public class Rectangle implements Shape {

   @Override
   public void draw() {
      System.out.println("Shape: Rectangle");
   }
}

Circle.java

package com.demo.gof;
public class Circle implements Shape {

   @Override
   public void draw() {
      System.out.println("Shape: Circle");
   }
}

3. 创建实现了 Shape 接口的抽象装饰类

ShapeDecorator.java

package com.demo.gof;
public abstract class ShapeDecorator implements Shape {
   protected Shape decoratedShape;

   public ShapeDecorator(Shape decoratedShape){
      this.decoratedShape = decoratedShape;
   }

   public void draw(){
      decoratedShape.draw();
   }    
}

4. 创建扩展了 ShapeDecorator 类的实体装饰类

RedShapeDecorator.java

package com.demo.gof;
public class RedShapeDecorator extends ShapeDecorator {

   public RedShapeDecorator(Shape decoratedShape) {
      super(decoratedShape);        
   }

   @Override
   public void draw() {
      decoratedShape.draw();           
      setRedBorder(decoratedShape);
   }

   private void setRedBorder(Shape decoratedShape){
      System.out.println("Border Color: Red");
   }
}

5. 使用 RedShapeDecorator 来装饰 Shape 对象

DecoratorPatternDemo.java

package com.demo.gof;
public class DecoratorPatternDemo {
   public static void main(String[] args) {

      Shape circle = new Circle();

      Shape redCircle = new RedShapeDecorator(new Circle());

      Shape redRectangle = new RedShapeDecorator(new Rectangle());
      System.out.println("Circle with normal border");
      circle.draw();

      System.out.println("\nCircle of red border");
      redCircle.draw();

      System.out.println("\nRectangle of red border");
      redRectangle.draw();
   }
}

编译运行以上 Java 范例,输出结果如下

$ javac -d . src/main/com.demo/gof/DecoratorPatternDemo.java
$ java  com.demo.gof.DecoratorPatternDemo
Circle with normal border
Shape: Circle

Circle of red border
Shape: Circle
Border Color: Red

Rectangle of red border
Shape: Rectangle
Border Color: Red

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1482232.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JProfiler 14 for Mac 14.0激活版:Java性能分析的终极工具

JProfiler是一款专业的Java应用程序性能分析工具,可帮助开发人员识别和解决Java应用程序中的性能问题。JProfiler支持Java SE、Java EE和Android平台,提供了多种分析选项,包括CPU分析、内存分析和线程分析等。 软件下载:JProfiler…

本地快速部署谷歌开放模型Gemma教程(基于WasmEdge)

本地快速部署谷歌开放模型Gemma教程(基于WasmEdge) 一、介绍 Gemma二、部署 Gemma2.1 部署工具2.1 部署步骤 三、构建超轻量级 AI 代理四、总结 一、介绍 Gemma Gemma是一系列轻量级、最先进的开放式模型,采用与创建Gemini模型相同的研究和技…

利用IP地址识别风险用户:保护网络安全的重要手段

随着互联网的发展和普及,网络安全问题日益突出,各种网络诈骗、恶意攻击等风险不断涌现,给个人和企业的财产安全和信息安全带来了严重威胁。在这样的背景下,利用IP地址识别风险用户成为了保护网络安全的重要手段之一。IP数据云探讨…

太阳能供电井盖-物联网智能井盖监测系统-旭华智能

在这个日新月异的科技时代,城市的每一个角落都在悄然发生变化。而在这场城市升级的浪潮中,智能井盖以其前瞻性的科技应用和卓越的安全性能,正悄然崭露头角,变身马路上的智能“眼睛”,守护城市安全。 传统的井盖监测系统…

Facebook直播网络需要满足什么条件

Facebook直播已经成为了企业、个人和组织开展在线活动、互动和营销的重要平台之一。然而,要确保Facebook直播的顺利进行和观众体验的良好,需要满足一系列关键条件。本文将探讨Facebook直播网络 需要满足的关键条件。 1、稳定的互联网连接: 稳…

【airtest】自动化入门教程(二)airtest操作

目录 一、touch 二、wait 三、swipe 四、exists 五、text 六、keyevent 七、snapshot 八、sleep 九、断言 9.1 assert_exists 9.2 assert_not_exists 9.3 assert_equal 9.4 assert_not_equal 前言:本文主要针对aritest部分的基础操作,aritest是一个跨平…

加密与安全_探索口令加密算法(PBE)

文章目录 概述疑问PBE 算法 ( Password Based Encryption)CodePOM实现 小结 概述 加密与安全_探索对称加密算法中我们提到AES加密密钥长度是固定的128/192/256位,而不是我们用WinZip/WinRAR那样,随便输入几位都可以。 这是因为对…

Mac 以SH脚本安装Arthas

SH脚本安装Aethas curl -L https://alibaba.github.io/arthas/install.sh | sh安装脚本说明 示例源文件: #! /bin/bash# temp file of as.sh TEMP_ARTHAS_FILE"./as.sh.$$"# target file of as.sh TARGET_ARTHAS_FILE"./as.sh"# update timeo…

alpine创建lnmp环境alpine安装nginx+php5.6+mysql

前言 制作lnmp环境,你可以在alpine基础镜像中安装相关的服务,也可以直接使用Dockerfile创建自己需要的环境镜像。 注意:提前确认自己的alpine版本,本次创建基于alpine3.6进行创建,官方在一些版本中删除了php5 1、拉取…

Flutter中Future和Stream关系

Future和Stream类是Dart异步编程的核心。 Future 表示一个不会立即完成的计算过程。与普通函数直接返回结果不同的是异步函数返回一个将会包含结果的 Future。该 Future 会在结果准备好时通知调用者。 Stream 是一系列异步事件的序列。其类似于一个异步的 Iterable,…

Linux磁盘性能方法以及磁盘io性能分析

Linux磁盘性能方法以及磁盘io性能分析 1. fio压测1.1. 安装fio1.2. bs 4k iodepth 1:随机读/写测试,能反映硬盘的时延性能1.3. bs 128k iodepth 32:顺序读/写测试,能反映硬盘的吞吐性能 2. dd压测2.1. 测试纯写入性能2.2. 测试…

禾赛戳了自动驾驶的眼睛?

大数据产业创新服务媒体 ——聚焦数据 改变商业 激光雷达之于自动驾驶,就如同眼睛和大脑至于人,重要性自然不言而喻。 然而,对于自动驾驶如此重要的关键零件,2月29日,有消息称,部分使用禾赛科技激光雷达的…

基于Python3的数据结构与算法 - 09 希尔排序

一、引入 希尔排序是一种分组插入排序的算法。 二、排序思路 首先取一个整数d1 n/2,将元素分为d1个组,每组相邻量取元素距离为d1,在各组内直接进行插入排序;取第二个整数d2 d1/2, 重复上述分组排序过程&#xff0…

鬼屋游戏c++

c #include <iostream> #include <string> #include <vector> #include <cstdlib> // 用于随机数生成 #include <ctime> // 用于随机数种子using namespace std;// 定义房间结构体 struct Room {string description;bool hasKey;bool hasClue…

Java中的动态代理与Spring AOP编程

第一章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;在Java里&#xff0c;动态代理和Spring AOP&#xff08;面向切面编程&#xff09;是两个能让代码更加灵活、更加干净的强大工具。作为一名Java程序员&#xff0c;小黑觉得掌握它们对于写出高质量的代码来说非常…

win11安装nodejs

一、下载安装包 链接: https://pan.baidu.com/s/1_df8s1UlgNNaewWrWgI59A?pwdpsjm 提取码: psjm 二、安装步骤 1.双击安装包 2.Next> 3.勾选之后&#xff0c;Next> 4.点击Change&#xff0c;选择你要安装的路径&#xff0c;然后Next> 5.点击Install安装 二、…

最新Sora人工智能视频资源网址分享

1&#xff0c;了解什么是Sora * 什么是 OpenAI Sora&#xff1f; Sora 是由 OpenAI 开发的文本到视频模型。它可以按照用户的提示生成长达一分钟的高质量和一致的视频。 * 如何使用 OpenAI Sora 模型&#xff1f; 目前&#xff0c;OpenAI Sora 模型处于内测阶段&#xff0c;并将…

深入剖析k8s-Pod篇

为什么需要Pod&#xff1f; 进程是以进程组的方式组织在一起。受限制容器的“单进程模型”&#xff0c; 成组调用没有被妥善处理&#xff08;资源调用有限&#xff09;&#xff0c;使用资源囤积则导致复杂度上升。 在k8s项目中&#xff0c;Pod的实现需要使用一个中间容器——…

【快速选择】解决TopK问题

目录 一、什么是TopK问题 二、优先级队列 优先级队列介绍 代码实现 三、使用优先级队列解决TopK问题 四、快速选择算法解决TopK问题 快速选择 图解快速选择 代码解决前k小个元素 五、优先级队列与快速选则算法比较 优先级队列 快速选择 一、什么是TopK问题 TopK问题…

Mybatis plus核心功能-IService

目录 1 前言 2 使用方法 2.1 继承ServiceImpl,> 2.2 基础业务开发的使用 2.3 复杂业务开发的使用 2.3 Lambda查询 2.4 Lambda更新 1 前言 我本以为Mapper层的类能够继承BaseMapper<XXX>&#xff0c;而不用我们手动写一些mapper方法已经够离谱了。没想到海油膏…