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

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 {@Overridepublic void draw() {System.out.println("Shape: Rectangle");}
}

Circle.java

package com.demo.gof;
public class Circle implements Shape {@Overridepublic 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);        }@Overridepublic 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: CircleCircle of red border
Shape: Circle
Border Color: RedRectangle of red border
Shape: Rectangle
Border Color: Red

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

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

相关文章

陶瓷工业5G智能制造工厂数字孪生可视化平台,推进行业数字化转型

陶瓷工业5G智能制造工厂数字孪生可视化平台,推进行业数字化转型。在陶瓷工业领域,5G智能制造工厂数字孪生可视化平台的应用正在改变着行业的传统生产模式,推动着数字化转型的进程。本文将围绕这一主题展开探讨,分析数字孪生可视化…

配置之道:深入研究Netty中的Option选项

欢迎来到我的博客,代码的世界里,每一行都是一个故事 配置之道:深入研究Netty中的Option选项 前言Option的基础概念ChannelOption与Bootstrap Option常见的ChannelOption类型ChannelConfig的使用Option的生命周期不同传输协议的Option 前言 在…

Tomcat部署Web服务器及基础功能配置

前言 Tomcat作为一款网站服务器,目前市面上Java程序使用的比较多,作为运维工人,有必要了解一款如何去运行Java环境的网站服务。 目录 一、Java相关介绍 1. Java历史 2. Java跨平台服务 3. Java实现动态网页功能 3.1 servelt 3.2 jsp …

Revit-二开之创建TextNote-(1)

Revit二开之创建TextNote TextNode在Revit注释模块中,具体位置如图所示 图中是Revit2018版本 【Revit中的使用】 Revit 中的操作是点击上图中的按钮在平面视图中点击任意放置放置就行, 在属性中可以修改文字 代码实现 创建TextNode ExternalComm…

Web Tomcat

目录 1 前言2 Tomcat的安装3 Tomcat文件的构成4 Tomcat的使用步骤 1 前言 Tomcat是一个 http(web)的容器,笼统的理解一下所有的网站都叫做web。这个web容器可以把我们的前端(htmlcssjs)和后端(servlet)代码都运行起来。 Tomcat是一个免费的开源的Servlet容器&#…

Flutter中的三棵树

Widget Tree: 页面配置信息。 Element Tree: Widget tree的实例化对象,创建出renderObject,并关联到element.renderobject属性上,最后完成RenderObject Tree的创建。 RenderObject Tree:完成布局和图层绘制…

【嵌入式学习】网络编程day03.02

一、项目 1、TCP机械臂测试 #include <myhead.h> #define SER_IP "192.168.126.32" #define SER_PORT 8888 #define CER_IP "192.168.126.42" #define CER_PORT 9891 int main(int argc, const char *argv[]) {int wfd-1;//创建套接字if((wfdsocke…

《TCP/IP详解 卷一》第8章 ICMPv4 和 ICMPv6

目录 8.1 引言 8.1.1 在IPv4和IPv6中的封装 8.2 ICMP 报文 8.2.1 ICMPv4 报文 8.2.2 ICMPv6 报文 8.2.3 处理ICMP报文 8.3 ICMP差错报文 8.3.1 扩展的ICMP和多部报文 8.3.2 目的不可达和数据包太大 8.3.3 重定向 8.3.4 ICMP 超时 8.3.5 参数问题 8.4 ICMP查询/信息…

划分开始结束位置设置标记

划分开始结束位置 初始音轨如下图所示 在想开始地方单击左键&#xff0c;长按直到你想要的结束位置松开。就可以划分开始和结束位置 设置标记 方式1 &#xff1a;直接点击该图标 方式二&#xff1a;使用快捷键M 设置标记点可以自定义名称方便检索标记点

javaWebssh酒店客房管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh酒店客房管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0…

STL容器之string类

文章目录 STL容器之string类1、 什么是STL2、STL的六大组件3、string类3.1、string类介绍3.2、string类的常用接口说明3.2.1、string类对象的常见构造3.2.2、string类对象的容量操作3.2.3、string类对象的访问及遍历操作3.2.4、 string类对象的修改操作3.2.5、 string类非成员函…

车辆维护和燃油里程跟踪器LubeLogger

什么是 LubeLogger &#xff1f; LubeLogger 是一个自托管、开源、基于网络的车辆维护和燃油里程跟踪器。 LubeLogger 比较适合用来跟踪管理您的汽车的维修、保养、加油的历史记录&#xff0c;比用 Excel 强多了 官方提供了在线试用&#xff0c;可以使用用户名 test 和密码 123…

机器学习-4

文章目录 前言数组创建切片索引索引遍历切片编程练习 总结 前言 本篇将介绍数据处理 Numpy 库的一些基本使用技巧&#xff0c;主要内容包括 Numpy 数组的创建、切片与索引、基本运算、堆叠等等。 数组创建 在 Python 中创建数组有许多的方法&#xff0c;这里我们使用 Numpy 中…

14.最长公共前缀

题目&#xff1a;编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串""。 解题思路&#xff1a;横向扫描&#xff0c;依次遍历每个字符串&#xff0c;更新最长公共前缀。另一种方法是纵向扫描。纵向扫描时&#xff0c;从前…

基于tomcat的JavaWeb实现

Tomcat服务器 免费&#xff0c;性能一般的服务器 安装配置 基于Java&#xff0c;故需要配置环境变量&#xff0c;新加系统路径JAVA_HOME&#xff0c;路径为jdk的主目录。 而后打开bin目录下的startup.bat文件出现如下窗口说明配置成功 idea继承tomcat服务器 使用java开发…

Linux 之压缩与解压相关命令的基础用法

目录 1、zip 与 unzip 2、gzip 命令 3、tar 命令 1、zip 与 unzip 在桌面新建一个文件和文件夹用于测试 在 test 目录下有一个 1.txt 文件 我们使用 zip 命令对其压缩 用法&#xff1a; zip 自定义压缩包名 被压缩文件路径位置 zip myon.zip 1.txt 因为我们这里就是在 …

linux_day04

大纲&#xff1a;命令&#xff0c;vim&#xff0c;gcc&#xff0c;编译工具&#xff0c;生成代码&#xff0c;调试&#xff0c;库makefile&#xff0c;系统编程 文件系统&#xff1a;文件属性&#xff0c;文件内容&#xff0c;万物皆文件&#xff08;不在内存中的是文件&#…

ProtoBuf 是什么?

1. 序列化概念 序列化和反序列化 序列化&#xff1a;把对象转换为字节序列的过程称为对象的序列化。 反序列化&#xff1a;把字节序列恢复为对象的过程称为对象的反序列化。 什么情况下需要序列化 存储数据&#xff1a;当你想把的内存中的对象状态保存到⼀个⽂件中或者存到数…

怎么压缩成mp4视频?

在数字化时代&#xff0c;视频已经成为我们日常生活中不可或缺的一部分。然而&#xff0c;有时候我们可能会遇到视频文件太大的问题&#xff0c;不便于传输、存储或分享。那么&#xff0c;如何将视频压缩成MP4格式&#xff0c;以减小文件大小呢&#xff1f;本文将为您介绍几种简…

docker学习第一步:基于Linux安装docker!

要求Linux下的CentOS 7.0 以上的版本 01、安装docker版本仓库 1、设置仓库 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 2、稳定仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 现在我也找了很…