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

2024-01-24 23:52

本文主要是介绍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毕设、网页和系统设计,还有你是刚入职的新手需要度过试用期。请在关注私信我,本人看到一定马上回复!

这篇关于Java 设计者模式以及与Spring关系(六) 装饰和模版方法模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

如何将Python彻底卸载的三种方法

《如何将Python彻底卸载的三种方法》通常我们在一些软件的使用上有碰壁,第一反应就是卸载重装,所以有小伙伴就问我Python怎么卸载才能彻底卸载干净,今天这篇文章,小编就来教大家如何彻底卸载Pyth... 目录软件卸载①方法:②方法:③方法:清理相关文件夹软件卸载①方法:首先,在安装python时,下

电脑死机无反应怎么强制重启? 一文读懂方法及注意事项

《电脑死机无反应怎么强制重启?一文读懂方法及注意事项》在日常使用电脑的过程中,我们难免会遇到电脑无法正常启动的情况,本文将详细介绍几种常见的电脑强制开机方法,并探讨在强制开机后应注意的事项,以及如何... 在日常生活和工作中,我们经常会遇到电脑突然无反应的情况,这时候强制重启就成了解决问题的“救命稻草”。那

kali linux 无法登录root的问题及解决方法

《kalilinux无法登录root的问题及解决方法》:本文主要介绍kalilinux无法登录root的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录kali linux 无法登录root1、问题描述1.1、本地登录root1.2、ssh远程登录root2、

SpringMVC获取请求参数的方法

《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F

springboot项目中常用的工具类和api详解

《springboot项目中常用的工具类和api详解》在SpringBoot项目中,开发者通常会依赖一些工具类和API来简化开发、提高效率,以下是一些常用的工具类及其典型应用场景,涵盖Spring原生... 目录1. Spring Framework 自带工具类(1) StringUtils(2) Coll

Python中的魔术方法__new__详解

《Python中的魔术方法__new__详解》:本文主要介绍Python中的魔术方法__new__的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、核心意义与机制1.1 构造过程原理1.2 与 __init__ 对比二、核心功能解析2.1 核心能力2.2

Python Transformer 库安装配置及使用方法

《PythonTransformer库安装配置及使用方法》HuggingFaceTransformers是自然语言处理(NLP)领域最流行的开源库之一,支持基于Transformer架构的预训练模... 目录python 中的 Transformer 库及使用方法一、库的概述二、安装与配置三、基础使用:Pi

关于pandas的read_csv方法使用解读

《关于pandas的read_csv方法使用解读》:本文主要介绍关于pandas的read_csv方法使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录pandas的read_csv方法解读read_csv中的参数基本参数通用解析参数空值处理相关参数时间处理相关