设计模式篇---装饰模式

文章目录

    • 概念
    • 结构
    • 实例
    • 总结

概念

装饰模式:动态的给一个对象增加一些额外的职责。就扩展功能而言,装饰模式提供了 一种比使用子类更加灵活的替代方案。
装饰模式是一种对象结构型模式,它以对客户透明的方式动态地给一个对象附加上更多的责任,可以在不需要创建更多子类的情况下让对象的功能得以扩展。

结构

在这里插入图片描述
Component(抽象构件):具体构件和抽象装饰类的共同父类,声明了在具体构件中实现的业务方法。
ConcreteComponent(具体构件):抽象构件的子类,用于定义具体的构件对象,实现了在抽象构件中声明的方法,装饰类可以给它增加额外的职责。
Decorator(抽象装饰类):它也是抽象构件的子类,用于给具体构件增加职责,但具体职责在其子类中实现。它维护一个指向抽象构件对象的引用,通过该引用可以调用装饰之前构件对象的方法,并通过其子类扩展该方法,以达到装饰的目的。
ConcreteDecorator(具体装饰类):抽象装饰类的子类,负责向构件添加新的职责。每一个具体装饰类都定义了一些新的行为,它可以调用在抽象装饰类中定义的方法,并可以增加新的方法用于扩充对象的行为。

实例

现在某公司开发了一个套图形界面构件库,该构件库提供了大量的基本构件,如窗体、文本框、列表框等,用户在使用构件库时用户经常要求定制一些特殊的显示效果,如带滚动条的窗体,带黑色边框的文本框等,因此经常需要对该构件库进行扩展以增强其功能。
在这里插入图片描述
Component 类

public abstract class Component {

    public abstract void display();

}

Windows 类,窗体类,具体的构件类

public class Windows extends Component{
    @Override
    public void display() {
        System.out.println("显示窗体");
    }
}

TextBox类,文本框类,充当具体构件类

public class TextBox extends Component {
    @Override
    public void display() {
        System.out.println("显示文本框");
    }
}

ListBox类,列表框类,充当具体的构件类

public class ListBox extends Component{
    @Override
    public void display() {
        System.out.println("显示列表框");
    }
}

ComponentDecorator类,充当抽象装饰类

public class ComponentDecorator extends Component {

    private Component component;


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

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

ScrollBarDecorator,滚动条装饰类,充当具体装饰类

public class ScrollBarDecorator extends ComponentDecorator {
    public ScrollBarDecorator(Component component) {
        super(component);
    }


    public void display() {
        this.setScrollBar();
        super.display();
    }

    public void setScrollBar() {
        System.out.println("为构件增加滚动条");
    }
}

BlackBorderDecorator类,黑色边框装饰类,充当具体装饰类

public class BlackBorderDecorator extends ComponentDecorator {

    public BlackBorderDecorator(Component component) {
        super(component);
    }

    public void display() {
        this.setBlackBorder();
        super.display();
    }

    public void setBlackBorder() {
        System.out.println("为构件增加黑色边框");
    }
}

客户端

public class Client {
    public static void main(String[] args) {
        Component window = new Windows();
        Component windowDecorator = new BlackBorderDecorator(window);
        windowDecorator.display();
    }
}

打印结果:
在这里插入图片描述

总结

装饰模式的链路主要是通过继承方式实现的,主要思路是在装饰者类里面包了一层被装饰者,然后客户端调用装饰者的方法时,先实现装饰者自己的装饰方法,然后再实现被装饰者的方法。
装饰者模式和代理模式很相似,装饰者是装饰类和被装饰类实现了相同的接口,代理是代理类和被代理类实现了相同的接口,都是增强了能力,但前者是增强了自己,让自己有更多的自定义能力,后者是让别人去处理自己的事情。一个是让自己能力变强,一个是让别人替自己办事。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023-11-17 VsCode使用makefile进行多文件编译

点击 <C 语言编程核心突破> 快速C语言入门 VsCode使用makefile进行多文件编译 前言一、一个简单的多文件示例二、makefile基本语法三、VsCode使用makefile总结 前言 要解决问题: C或C可以多文件编译, 意味着需要进行代码组织, 为了方便多文件编译, gnu开发了make工具, …

使用键盘管理器更改键盘快捷键,让键盘真正迎合你的使用习惯

如果默认快捷键不适合你&#xff0c;你肯定会想知道如何在Windows 11中更改键盘快捷键。 也许你已经习惯了macOS键盘&#xff0c;或者像我一样在Windows和Mac之间切换工作/游戏——如果是这样的话&#xff0c;重新配置默认的Windows快捷方式&#xff0c;使其与Mac上的快捷方式…

双11背后的中国云厂商:新“标准化”,和调整后的新韧性

降价并不代表一味的压缩自身利润空间&#xff0c;云厂商已经开始向具有更高利润空间的PaaS、SaaS产品腾挪&#xff0c;核心产品在总包占比越来越高。 作者|斗斗 编辑|皮爷 出品|产业家 今年云厂商&#xff0c;全面拥抱双11。 作为中国最大的云计算服务提供商&#xff0…

释放搜索潜力:基于Milvus快速搭建语义检索系统(快速版),让信息尽在掌握

搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术…

完蛋! 我被MySQL索引失效包围了!

前言 一阵熟悉的起床闹钟响起&#xff0c;小菜同学醒来竟发现周围都是导致索引失效的原因&#xff1a;性感迷人的索引使用不当、可爱活泼的存储引擎无法识别索引列、刁蛮任性的优化器不选择索引... 知其然更要知其所以然&#xff0c;一起来看看索引为啥失效了吧~ 在阅读文本…

零基础安装分布式数据服务注册系统

一、先安装VM虚拟机&#xff0c;安装最新的ubuntu22系统&#xff0c; 先安装mysql&#xff0c; sudo apt install mysql-server sudo mysql_secure_installation 根据自己需求选择 密码安全级别时&#xff0c;选择n 删除匿名用户&#xff1f;&#xff08;按y|Y表示是&…

【加载自定义数据csv/image】HuggingFace的datasets库中load_dataset

1.加载自定义数据 load_dataset有以下参数&#xff0c;具体可参考 源码 def load_dataset(path: str,name: Optional[str] None,data_dir: Optional[str] None,data_files: Union[Dict, List] None,split: Optional[Union[str, Split]] None,cache_dir: Optional[str] No…

UE基础篇十一:Sequencer

导语: 视频文档在文末 知识点记录: 1、创建Sequence 2、动画可以设置权重值 作动画过渡 3、摄像机 可以设置追踪目标 调整一些摄像机参数等 4、在曲线编辑中编辑可以更详细调整路径 5、在一个序列中 添加添加另一个序列文件

git commit 后 发现提交信息写错了怎么办

解决方案&#xff1a; 可以使用 git commit --amend 命令。此命令将打开默认文本编辑器&#xff0c;允许你编辑最近的提交的提交信息。 以下是使用 git commit --amend 的步骤&#xff1a; 首先&#xff0c;在你的工作目录中进行所需的更改。运行 git add 命令将更改的文件添…

恒驰喜讯 | 荣获2023项目管理论坛“最佳集成服务伙伴”、“卓越合作伙伴项目经理”双奖

2023年11月7日~8日&#xff0c;以“价值交付共创未来”为主题的2023年项目管理论坛在深圳坂田成功举办。论坛上&#xff0c;来自海内外交付领域的200多名专家围绕项目管理实践、交付案例与项目优化等主题展开了深入交流&#xff0c;并就各区域项目管理案例做了经验分享&#xf…

ubuntu20.04.6安装Intel AX211网卡驱动

前言 环境&#xff1a; ThinkBook16 2023 款网卡Intel AX211 Wi-Fi6ubuntu版本20.04.6&#xff08;最后一位小数很重要&#xff09;系统内核 Linux wzy 5.15.0-67-generic #74~20.04.1-Ubuntu SMP Wed Feb 22 14:52:34 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux 方法&#x…

分布式事务 - seata安装

分布式事务 - seata 一、本地事务与分布式事务 1.1、本地事务 本地事务&#xff0c;也就是传统的单机事务。在传统数据库事务中&#xff0c;必须要满足四个原则&#xff08;ACID&#xff09;。 1.2、分布式事务 分布式事务&#xff0c;就是指不是在单个服务或单个数据库架构…

粉够荣获淘宝联盟理事会常务理事,共绘联盟生态新篇章

淘宝联盟区域理事会于2021年成立&#xff0c;首届成立成都、广州、武汉&#xff0c;服务近2000个领军淘宝客企业&#xff0c;作为区域生态与官方交流重要枢纽&#xff0c;理事会举办近百场交流分享会&#xff0c;带动淘客跨域跨业态交流成长。 2023年9月7日第二届淘宝联盟理事…

React实战项⽬开发完整流程含代码

React实战演练项⽬一需求分析及项目初始化 需求分析 刚学完React,开始找项目进行上手练习&#xff01; 页面组件拆分&#xff1a; 头部&#xff1a;导航tab、搜索框、登录注册 中间&#xff1a;分类导航、轮播图、新人福利、高单价产品导航 课程分类列表、底部内容、登陆提…

MinIO实现数据迁移(mc)

运行两个版本的minio version: 2.3 services: # 新版本 minio2023: image: minio/minio:RELEASE.2022-06-20T23-13-45Z.fips container_name: minio2023 restart: always environment: - MINIO_ACCESS_KEYminioadmin - MINIO_SECRET_KEYminioadmin - MINIO_ROOT_USERminioadm…

为什么要使用动态代理IP?数据采集使用动态代理有哪些优势?

随着互联网的普及&#xff0c;数据采集已经成为企业、营销人员和数据分析师的重要工作之一。然而&#xff0c;在采集数据的过程中&#xff0c;经常会遇到一些问题&#xff0c;如IP被封禁、访问受限等。为了解决这些问题&#xff0c;动态代理IP应运而生。那么&#xff0c;为什么…

TP-LINK联洲面试题

文章目录 1.说一下微服务架构?2.微服务优缺点3.负载均衡的实现算法4.Redis集群部署方式?5.MySQL主从复制?5.1 配置流程5.2 优缺点分析6.口头手撕快排7.队列实现栈和栈实现队列7.1 队列实现栈7.2 栈实现队列8.进程有几种状态?9.Spring Boot Actuator?10.外键、主键和索引?…

数字化转型具体包含哪些内容?

数字化转型是一个广泛且多方面的过程&#xff0c;涉及将数字技术集成到组织或企业的各个方面&#xff0c;从根本上改变其运营和交付价值的方式。它包含广泛的活动、战略和举措&#xff0c;这些活动、战略和举措可能会根据组织的具体目标和需求而有所不同。以下是数字化转型的一…
最新文章