Java 设计者模式以及与Spring关系(六) 装饰和模版方法模式

简介:

本文是个系列一次会出两个设计者模式作用,如果有关联就三个,除此外还会讲解在spring中作用。

23设计者模式以及重点模式

我们都知道设计者模式323种设计模式,标红是特别重要的设计者模式建议都会,而且熟读于心,标蓝是指其次重要建议也要明白。

(1)创建型模式:单例模式抽象工厂模式构建者模式工厂模式原型模式

(2)结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式

(3)行为型模式:访问者模式、模版方法模式命令模式、迭代器模式观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式。

装饰器模式(Decorator Pattern)

装饰器模式是一种结构型设计模式,允许动态地向一个对象添加额外的职责。在不改变对象自身的基础上,通过创建一个包装对象来“装饰”原始对象。这种模式创建了一个装饰类,用来包裹原始类,并在保持原类方法签名完整性的同时提供了额外的功能。

装饰器模式 专注于动态地添加职责到对象上,是一种灵活的替代继承的方法。

使用场景

  • 当不想或不能通过继承增加对象的职责时,例如,当系统中的职责在运行时可能动态变化,或职责可选时。
  • 当需要为一个对象添加一些额外的功能,并且这些功能可以动态地被添加或删除。

示例

// 抽象组件
interface Coffee {String getDescription();double cost();
}// 具体组件
class SimpleCoffee implements Coffee {public String getDescription() {return "Simple Coffee";}public double cost() {return 2.0;}
}// 装饰器基类
abstract class CoffeeDecorator implements Coffee {protected Coffee decoratedCoffee;public CoffeeDecorator(Coffee decoratedCoffee) {this.decoratedCoffee = decoratedCoffee;}public String getDescription() {return decoratedCoffee.getDescription();}public double cost() {return decoratedCoffee.cost();}
}// 具体装饰器
class MilkDecorator extends CoffeeDecorator {public MilkDecorator(Coffee decoratedCoffee) {super(decoratedCoffee);}public String getDescription() {return decoratedCoffee.getDescription() + ", Milk";}public double cost() {return decoratedCoffee.cost() + 0.5;}
}// 测试类
public class DecoratorPatternDemo {public static void main(String[] args) {Coffee coffee = new SimpleCoffee();coffee = new MilkDecorator(coffee);System.out.println(coffee.getDescription() + " Cost: $" + coffee.cost());}
}

在这个示例中,Coffee 是一个抽象组件,SimpleCoffee 是具体的组件,CoffeeDecorator 是一个装饰器基类,而 MilkDecorator 是具体的装饰器。可以看到,装饰器模式使得可以在运行时为对象 coffee 添加新的职责。

模板方法模式(Template Method Pattern)

模板方法模式是一种行为型设计模式,它在父类中定义了一个操作的算法的骨架,而将一些步骤的实现延迟到子类中。这样,可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

模板方法模式 在父类中定义了算法的框架,允许子类在不改变算法结构的情况下重写算法的特定步骤。

使用场景

  • 当有多个类包含相同的算法,但算法的某些步骤在这些类之间有所不同时。
  • 当需要控制子类扩展时。模板方法只在特定点调用“钩子”方法,这允许在这些点进行扩展。

示例

// 抽象类
abstract class Game {abstract void initialize();abstract void startPlay();abstract void endPlay();// 模板方法public final void play() {initialize();startPlay();endPlay();}
}// 具体类
class Cricket extends Game {void initialize() {System.out.println("Cricket Game Initialized!");}void startPlay() {System.out.println("Cricket Game Started!");}void endPlay() {System.out.println("Cricket Game Finished!");}
}// 测试类
public class TemplateMethodPatternDemo {public static void main(String[] args) {Game game = new Cricket();game.play();}
}

在这个示例中,Game 是一个包含模板方法 play 的抽象类,而 Cricket 是具体实现这些抽象方法的子类。模板方法 play 定义了游戏的结构,但具体的步骤在子类中有不同的实现。

------------------------------------------与正文内容无关------------------------------------
如果觉的文章写对各位读者老爷们有帮助的话,麻烦点赞加关注呗!作者在这拜谢了!

混口饭吃了!如果你需要Java 、Python毕设、网页和系统设计,还有你是刚入职的新手需要度过试用期。请在关注私信我,本人看到一定马上回复!

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

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

相关文章

Deployment介绍

1、Deployment介绍 Deployment一般用于部署公司的无状态服务。 格式: apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metada…

菜鸟导入导出assetbundle

因为菜鸟不会用unity c#什么的,所以最后参考贴吧的方法用的是UABE(Unity Assets Bundle Extractor)和UABEA(Unity Assets Bundle Extractor Avalonia) 可以去github上下载 对于txt、xml什么的可以直接改,但是byte文件里还是会有一些类似乱码的东西&…

Qt5项目拆解第一集解决:中文乱码| 全局字体|注册表|QSS/CSS

# 一、乱码解决代码片段 QTextCodec是Qt中用于处理文本编码和字符集转换的类。它提供了一系列静态函数来实现不同编码的文本转换,包括编码转换、字符集检测和转换、以及数据流中的文本编码处理。QTextCodec类使得Qt可以在不同的编码和字符集之间进行无缝转换,从而方便地处理…

Switch用法以及新特性-最全总结版

本篇文章参考了大佬文章,感谢大佬无私分享: http://t.csdnimg.cn/MjZnX http://t.csdnimg.cn/QFg0x 目录 一、Switch用法:JDK7及以前 1.1、举例一: 1.2、举例二: 二、Switch穿透: 2.1、举例&#xf…

【Linux】常见指令(二)

前言 常见指令第二部分。 文章目录 一、指令&#xff08;下&#xff09;重定向>&#xff1a;输出重定向>>&#xff1a;追加输出<&#xff1a;输入重定向 10. more—显示文本文件内容11.less—逐屏浏览文本文件内容12. head13. tail管道 |14. date—时间指令在这里插…

2024年可能会用到的几个地图可视化模板

前言 在数字化的过程中&#xff0c;数据可视化变得越来越重要。用户喜欢通过酷炫的视觉效果和直观的数据展示来理解数据。可视化地图组件是数据可视化的重要组成部分。这些地图组件提供多样化的效果&#xff0c;能够更好地展示数据的关系和地理分布&#xff0c;直观地将数据与…

裁员潮中的自我成长,小故事,大鼓励

程序员裁员潮&#xff1a;技术变革下的职业危机 科技浪潮滚滚而来&#xff0c;我们了解科技&#xff0c;敬畏科技&#xff0c;拥抱科技。我们怕的不是裁员&#xff0c;而是自己无所适从的样子。 2023年&#xff0c;科技公司裁员的新闻屡见不鲜。据统计&#xff0c;今年以来&…

uniapp设置隐藏原生导航栏(3)

1、单个页面隐藏 在pages.json里配置 (第一种方式) {"path": "pages/home/index","style": {"navigationBarTitleText": "首页","navigationStyle": "custom" // 使用自定义导航栏&#xff0c;系统会关…

SpringBoot3+JDK21集成MyBatisPlus3.5.5

哈喽&#xff0c;大家好&#xff0c;我是呼噜噜&#xff0c;在上一篇文章SpringBoot3Jdk17来了 | 春见知识分享基础上&#xff0c;笔者把jdk17直接换成了jdk21一步到位&#xff0c;来踩踩坑 添加依赖 修改pom.xml文件&#xff1a; <dependency><groupId>com.baom…

日历的实现(java语言,包括钟表盘的实现、日历内部的日程提醒)

整理文件发现了大一的时候的作业&#xff0c;先感慨一波时间过得真的快&#xff01; 手中的这个是一个独立的java文件&#xff0c;可以直接就可以运行&#xff0c;应该是没有什么问题的。不想这个代码就此落灰了&#xff0c;希望可以给友友们带来一点点帮助&#xff01; 运行…

避免邮件进入垃圾箱的实用技巧:提高邮件接收率的策略

邮件进垃圾邮箱一部分原因是IP地址出现了问题&#xff0c;一部分是邮件内容。那我们应该怎么避免邮件进入垃圾邮箱呢&#xff1f; 1、邮件内容 1&#xff09;邮件标题 邮件标题是影响邮件打开率非常重要的因素&#xff0c;所以大家可能会在标题上放置一些吸引人的符号或者词…

聚道云连接器助力钉钉与金蝶云星辰无缝对接,实现多维度数据同步

客户介绍 某企业服务有限公司专注于为企业提供全方位、高质量的企业服务&#xff0c;致力于于企业管理咨询、企业形象策划、市场营销策划、财务管理咨询等方面。该公司拥有一支经验丰富、专业化的团队&#xff0c;他们深入了解企业需求&#xff0c;为客户提供个性化的解决方案…

列表的创建与删除

Python 中列表可以动态地添加、修改和删除元素&#xff0c;是 Python 编程中不可或缺的一部分。本文将介绍如何使用 Python 创建和删除列表&#xff0c;以及常用的方法和技巧。 创建列表 在 Python 中&#xff0c;我们可以使用一对方括号 [ ] 来创建一个空列表&#xff0c;也可…

开源免费无广告Gopeed,现代化的高速下载器,支持(HTTP、BitTorrent、Magnet)等多种协议下载,开源免费、无广告、高度可定制、不限速。

目录 特点 支持的平台 一键部署 体验 特点 全平台支持、开源免费&#xff0c;不限速、无广告 遵循 GPL-3.0 开源协议 支持&#xff08;HTTP、BitTorrent、Magnet&#xff09;协议下载 高速下载&#xff0c;底层使用golang协程并发下载 每日自动更新 tracker 列表 去中心…

IPv4 over IPv6简介

在IPv4 Internet向IPv6 Internet过渡的后期&#xff0c;IPv6网络已被大量部署&#xff0c;此时可能出现IPv4孤岛。利用隧道技术可在IPv6网络上创建隧道&#xff0c;从而实现IPv4孤岛的互连。这类似于在IP网络上利用隧道技术部署VPN。在IPv6网络上用于连接IPv4孤岛的隧道&#x…

Oracle触发器简单应用示例

目录 一、应用描述 【1】、应用场景&#xff1a; 【2】、具体场景&#xff1a; 二、表结构介绍 【1】表名介绍&#xff1a; 【2】表结构&#xff1a; 三、设置触发器 一、应用描述 【1】、应用场景&#xff1a; 现有一张库存明细以及销售明细表&#xff0c;销售明细表发生…

知识图谱符号表示比较:特性图、RDF和OWL

目录 前言1 特性图&#xff1a;灵活的图结构表示1.1 优势与灵活性1.2 存储优化与查询优势1.3 挑战&#xff1a;缺乏工业标准支持 2 RDF&#xff08;Resource Description Framework&#xff09;&#xff1a;面向Web的数据标准2.1 三元组结构的优势2.2 语义标准与词汇丰富性2.3 …

elment-plus如何引入scss文件实现自定义主题色

elment-plus如何引入scss文件实现自定义主题色&#xff01;如果您想修改elementPlus的默认主题色调&#xff0c;使用自定义的色调&#xff0c;可以考虑使用官方提供的解决办法。 第一步你需要在项目内安装sass插件包。 npm i sass -D 如图&#xff0c;安装完成后&#xff0c;你…

gdzwfw某省公共资源交易平台逆向学习

声明&#xff1a;本文中网站仅为学习技术使用&#xff0c;请勿暴力爬取数据。 学习地址&#xff1a;aHR0cHM6Ly95Z3AuZ2R6d2Z3Lmdvdi5jbi8jLzQ0L2p5Z2c 此网站采用请求头反爬&#xff0c;难点是请求头中几个参数是如何生成的&#xff08;别问为什么知道是请求头&#xff0c;一…

java进阶-jvm精讲及实战

深入了解jvm及实战 1.引言2.jvm概念理解1.1什么是jvm1.2 jvm功能1.3 jvm规范及主流版本1.4 jre jdk jvm的区别和联系1.5 jvm组成 2.jvm-字节码文件class2.1 java和class无关性2.2 字节码应用场景2.4 字节码文件打开方式2.3 字节码文件组成2.3.1 一般信息2.3.2 常量池2.3.3 方法…