设计模式-装饰器模式Decorator(结构型)

news2024/11/27 11:30:42

装饰器模式(Decorator)

装饰器模式是一种结构模式,通过装饰器模式可以在不改变原有类结构的情况下向一个新对象添加新功能,是现有类的包装。

图解请添加图片描述

角色

  1. 抽象组件:定义组件的抽象方法
  2. 具体组件:实现组件的抽象方法
  3. 抽象装饰器:实现抽象组件接口,聚合具体组件
  4. 具体装饰器:定义装饰方法,重写抽象组件的抽象方法,并在方法内调用具体组件的方法实现和装饰方法

代码示例

抽象组件:

public interface Shape {
    void paint();
}

具体组件:

public class Rotundity implements Shape {
    @Override
    public void paint() {
        System.out.println("画了一个圆形");
    }
}

public class Triangle implements Shape{
    @Override
    public void paint() {
        System.out.println("画了一个三角形");
    }
}

抽象装饰器

public abstract class ShapeDecorator implements Shape{
    protected Shape shape;

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

具体装饰器

/** 颜色装饰*/
public class ColorDecorator extends ShapeDecorator{
    public ColorDecorator(Shape shape) {
        super(shape);
    }
    @Override
    public void paint() {
        shape.paint();
        filling();
    }
    private void filling(){
        System.out.println("并填充颜色");
    }
}
/** 字体装饰*/
public class FontDecorator extends ShapeDecorator{
    public FontDecorator(Shape shape) {
        super(shape);
    }

    @Override
    public void paint() {
        shape.paint();
        changePaint();
    }
    public void changePaint(){
        System.out.println("并加粗了字体");
    }
}

使用

public class Test {
    public static void main(String[] args) {
        Shape triangle = new Triangle();
        Shape rotundity = new Rotundity();
        Shape triangleColorDecorator = new ColorDecorator(triangle);
        Shape rotundityColorDecorator = new ColorDecorator(rotundity);
        System.out.println("画一个三角形,并填充颜色:");
        triangleColorDecorator.paint();
        System.out.println("画一个圆形,并填充颜色,在加粗字体:");
        FontDecorator fontDecorator = new FontDecorator(rotundityColorDecorator);
        fontDecorator.paint();
    }
}
画一个三角形,并填充颜色:
画了一个三角形
并填充颜色
画一个圆形,并填充颜色,在加粗字体:
画了一个圆形
并填充颜色
并加粗了字体

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

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

相关文章

设计模式-代理模式Proxy(结构型)

代理模式(Proxy) 代理模式是一种结构型模式,它可以通过一个类代理另一个类的功能。代理类持有被代理类的引用地址,负责将请求转发给代理类,并且可以在转发前后做一些处理 图解 角色 抽象主题(Subject&…

计算机网络(9) TCP超时重传以及滑动窗口流量控制

一.确认机制与流量控制 引用:滑动窗口,TCP的流量控制机制 | 小菜学网络 确认机制 由于 IP 协议缺乏反馈机制,为保证可靠性,TCP 协议规定:当接收方收到一个数据后,必须回复 ACK 给发送方。这样发送方就能得…

Python学习打卡:day04

day4 笔记来源于:黑马程序员python教程,8天python从入门到精通,学python看这套就够了 目录 day428、while 循环的嵌套应用29、while 循环案例 — 九九乘法表补充知识示例:九九乘法表 30、for 循环基本语法while 和 for 循环对比f…

react 自定义Hook的实现

// 问题:当前组件耦合在一起的不方便复用 // 解决思路:自定义hook// 1。封装use打头的函数 // 2.在函数体内封装我们可复用的逻辑(只要是可复用的都行) // 3.要把组件中用到的状态(变量)或者回调return出去…

使用tkinter创建带有图标的菜单栏

使用tkinter创建带有图标的菜单栏 效果代码代码解析创建主窗口加载图标创建菜单栏添加文件菜单添加带图标的菜单项 Tkinter 的默认菜单外观较为简单,可以通过自定义和添加图标,让菜单显示更好看。 效果 代码 import tkinter as tk from tkinter import …

父亲节|“鞋”守一生,致敬那些年父亲的默默付出

父亲节,是一个感谢父亲的节日。普遍认为的日期是每年6月的第三个星期日,在这一天世界上有52个国家和地区在过父亲节。同时注重孝道也是我们中华民族的传统文化。 在岁月的长河中, 父亲如同那坚实的基石, 承载着家庭的重担&#…

N3 中文文本分类

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊# 前言 前言 前面学习了相关自然语言编码,这周进行相关实战 导入依赖库和设置设备 import torch import torch.nn as nn import torchvision fro…

栈的实现详解

目录 1. 栈1.1 栈的概念及结构1.2 栈的实现方式1.3 栈的应用场景 2. 栈的实现2.1 结构体2.2 初始化2.3 销毁2.4 入栈2.5 出栈2.6 获取栈顶元素2.7 判空2.8 获取个数 3. test主函数4. Stack.c文件5. Stack.h文件6. 运行展示 1. 栈 1.1 栈的概念及结构 栈:一种特殊的…

找不到dll文件如何修复,总结多种dll丢失的修复方法

在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是“缺少DLL文件”。那么,DLL到底是什么呢?为什么计算机会缺失DLL文件?缺失DLL文件会对电脑产生什么具体影响?本文将详细解析这些问题&#xff0…

UC Berkeley简介以及和Stanford的区别与联系

UC Berkeley Source: Google Map 中文版 UC Berkeley,全称University of California, Berkeley,是一所位于美国加利福尼亚州伯克利市的世界知名公立研究型大学。以下是关于UC Berkeley的详细介绍: 学术声誉和排名 学术声誉: U…

Android入门第69天-AndroidStudio中的Gradle使用国内镜像最强教程

背景 AndroidStudio默认连接的是dl.google的gadle仓库。 每次重新build时: 下载速度慢;等待了半天总时build faild;build到一半connection timeout;即使使用了魔法也难以一次build好;这严重影响了我们的学习、开发效率。 当前网络上的使用国内镜像的教程不全 网上的教程…

056、PyCharm 快速代码重构的方法

在实际的编程过程中,如果有一段代码需要在多个地方重复使用,我们应该将这段代码封装成一个函数。这样可以提高代码的可重用性和可维护性。 在PyCharm编辑器里,可以使用以下操作对代码块进行快速的重构。 (1)、选中一…

【数据分析】推断统计学及Python实现

各位大佬好 ,这里是阿川的博客,祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 Python 初阶 Python–语言基础与由来介绍 Python–…

Spring Boot整合Redis通过Zset数据类型+定时任务实现延迟队列

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

mac终端:定位于当前文件夹位置Terminal设置快捷键,实现快速启动--m系列

mac自动脚本(f3直接搜或者找其他->自动操作) 然后找到如下功能: 代码如下: on run {input, parameters} tell application "Finder" set currFolder to POSIX path of (folder of the front window as string) end tell tell application "Termina…

人大高瓴/腾讯提出QAGCF:用于QA推荐的图形协同过滤

【摘要】问答(Q&A)平台通常推荐问答对来满足用户的知识获取需求,这与仅推荐单个项目的传统推荐不同。这使得用户行为更加复杂,并为Q&A推荐带来了两个挑战,包括:协作信息纠缠,即用户反馈受问题或答案的影响;以及语义信息纠缠,其中问题与其相应的答案相关联,不同问答对之…

软件工程实务:软件产品

目录 1、软件产品的基本概念 2、软件工程是什么? 为什么产生软件工程? 软件工程是做什么的? 3、定制软件和软件产品的工程比较 4 、软件产品的运行模式 5、软件产品开发时需要考虑的两个基本技术因素 6、产品愿景 7、软件产品管理 8、产品原型设计 9、小结…

C/C++:指针用法详解

C/C:指针 指针概念 指针变量也是一个变量 指针存放的内容是一个地址,该地址指向一块内存空间 指针是一种数据类型 指针变量定义 内存最小单位:BYTE字节(比特) 对于内存,每个BYTE都有一个唯一不同的编号…

DeepSORT(目标跟踪算法)卡尔曼滤波中的贝叶斯定理

DeepSORT(目标跟踪算法)卡尔曼滤波中的贝叶斯定理 flyfish 从例子中介绍名词 假设我们有一个袋子,里面有5个红球和3个蓝球。我们从袋子里随机抽取一个球。 概率 (Probability) 我们想计算从袋子里抽到红球的概率 P ( R ) P(R) P(R)。 …

4D毫米波雷达技术及发展

文章目录 前言一、4D毫米波雷达是什么?二、毫米波雷达是什么?毫米波雷达的基本原理多普勒效应 前言 现阶段自动驾驶技术中,主要用到的传感器有摄像头、激光雷达和毫米波雷达。 摄像头的光谱从可见光到红外光谱,是最接近人眼的传感…