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—时间指令在这里插…

rust for循环步长-1,反向逆序遍历

fn main() {for i in (0..3).rev().step_by(1) {print!("{}", i);} } // 打印结果&#xff1a;210Trait std::iter::Iterator fn rev(self) -> Rev where Self: Sized DoubleEndedIteratorfn step_by(self, step: usize) -> StepBy where Self: Sized

DI和IOC

依赖注入&#xff08;Dependency Injection, DI&#xff09;和控制反转&#xff08;Inversion of Control, IoC&#xff09;是面向对象编程中的两个重要概念&#xff0c;它们紧密相关并在现代软件开发中经常结合使用。 依赖注入&#xff1a; 依赖注入是一种设计模式&#xff0…

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

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

高高兴兴过春节

一年一度的春节到了&#xff0c;到处洋溢着节日的气氛&#xff0c;到处彩灯高照&#xff0c;鞭炮齐鸣。   早上&#xff0c;我早早地起来和姐姐一起给爷爷奶奶拜年&#xff0c;爷爷很开心给了我一个大大的红包。吃完早饭&#xff0c;妈妈贴春联&#xff0c;爸爸挂灯笼&#x…

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

程序员裁员潮&#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;为客户提供个性化的解决方案…

美化环境,保护母亲河

同学们&#xff0c;你们好&#xff1a;       大家都应该知道吧&#xff0c;我们的母亲河——黄河正在慢慢地恶化。       知道吗&#xff1f;我国为了防止北京再次遭受沙尘暴的袭击&#xff0c;在新疆&#xff0c;宁夏等多个沙漠化地区都种上了一“层”绿色的“防沙…

列表的创建与删除

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

关于 Go 协同程序(Coroutines 协程)、Go 汇编及一些注意事项。

参考&#xff1a; Go 汇编函数 - Go 语言高级编程 Go 嵌套汇编 - 掘金 (juejin.cn) 前言&#xff1a; Golang 适用 Go-Runtime&#xff08;Go 运行时&#xff0c;嵌入在被编译的PE可执行文件之中&#xff09;来管理调度协同程式的运行。 Go 语言没有多线程&#xff08;MT&a…

前端常见安全问题以及解决方案汇总

当涉及到前端开发时&#xff0c;安全性是至关重要的一环。在当今数字化的世界中&#xff0c;用户数据的保护和应用程序的安全性变得愈发重要。作为前端开发者&#xff0c;我们不仅需要关注页面的美观和功能&#xff0c;还要时刻牢记确保用户数据的安全以及应用程序的健壮性。本…

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

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