当前位置: 首页 > news >正文

原型,模板,策略,适配器模式

原型模式

原型模式(创建型模式),核心思想就是:基于一个已有的对象复制一个对象出来,通过复制来减少对象的直接创建的成本。
总结一下,原型模式的两种方法,浅拷贝只会复制对象里面的基本数据类型和引用对象的内存地址,不会递归地复制引用对象,以及引用对象的引用对象。而深拷贝就是会完全拷贝一个新的对象出来。所以,深拷贝的操作会比浅拷贝更加耗时,性能更差一点。同时浅拷贝的代码写起来也比深拷贝的代码写起来更简单一点。如果咱们拷贝的对象是不可变的,也就是说我这个对象只会查看,不会增删改,那么,直接用浅拷贝就好了,如果拷贝的对象存在增删改的情况,那么就需要使用深拷贝了。总而言之,就是要深浅得当,根据项目实际情况而定。
代码举例

// 原型接口
interface Shape extends Cloneable {void draw();Shape clone();
}// 具体原型类 - 圆形
class Circle implements Shape {private String color;public Circle(String color) {this.color = color;}@Overridepublic void draw() {System.out.println("Drawing a circle with color: " + color);}@Overridepublic Shape clone() {return new Circle(color);}
}// 具体原型类 - 正方形
class Square implements Shape {private String color;public Square(String color) {this.color = color;}@Overridepublic void draw() {System.out.println("Drawing a square with color: " + color);}@Overridepublic Shape clone() {return new Square(color);}
}// 原型管理器
class ShapeCache {private static Map<String, Shape> shapeMap = new HashMap<>();public static Shape getShape(String type) {Shape cachedShape = shapeMap.get(type);return (Shape) cachedShape.clone();}public static void loadCache() {Circle circle = new Circle("red");shapeMap.put("circle", circle);Square square = new Square("blue");shapeMap.put("square", square);}
}// 示例使用
public class PrototypePatternExample {public static void main(String[] args) {ShapeCache.loadCache();Shape clonedShape1 = ShapeCache.getShape("circle");clonedShape1.draw();  // 输出: Drawing a circle with color: redShape clonedShape2 = ShapeCache.getShape("square");clonedShape2.draw();  // 输出: Drawing a square with color: blue}
}

模板模式

模板方法模式也非常简单,但是,他却是比较重要的,在很多开源框架里面都用到了这个模式,并且,我们在做项目的时候,也会经常用到这个模式。这个模板方法模式,简单来说就是一句话:在父类中定义业务处理流程的框架,到子类中去做具体的实现。

代码举例

// 抽象模板类
abstract class Game {abstract void initialize();abstract void startPlay();abstract void endPlay();// 模板方法,定义算法框架public final void play() {initialize();startPlay();endPlay();}
}// 具体模板类 - 足球游戏
class FootballGame extends Game {@Overridevoid initialize() {System.out.println("Football Game Initialized! Start playing.");}@Overridevoid startPlay() {System.out.println("Playing football...");}@Overridevoid endPlay() {System.out.println("Football Game Finished!");}
}// 具体模板类 - 篮球游戏
class BasketballGame extends Game {@Overridevoid initialize() {System.out.println("Basketball Game Initialized! Start playing.");}@Overridevoid startPlay() {System.out.println("Playing basketball...");}@Overridevoid endPlay() {System.out.println("Basketball Game Finished!");}
}// 示例使用
public class TemplatePatternExample {public static void main(String[] args) {Game footballGame = new FootballGame();footballGame.play();// 输出:// Football Game Initialized! Start playing.// Playing football...// Football Game Finished!System.out.println();Game basketballGame = new BasketballGame();basketballGame.play();// 输出:// Basketball Game Initialized! Start playing.// Playing basketball...// Basketball Game Finished!}
}

策略模式

接着我们来看一下策略模式,策略模式呢也是非常简单,他就是定义一个主要的接口,然后很多个类去实现这个接口,比如说我们定义一个文件上传的接口,然后阿里云的上传类去实现它,腾讯云的上传类也去实现它,这样因为都是实现的同一个接口,所以上传类之间是可以在代码中互相替换的。

代码举例

// 策略接口
interface Strategy {int doOperation(int num1, int num2);
}// 具体策略类 - 加法
class AddStrategy implements Strategy {@Overridepublic int doOperation(int num1, int num2) {return num1 + num2;}
}// 具体策略类 - 减法
class SubtractStrategy implements Strategy {@Overridepublic int doOperation(int num1, int num2) {return num1 - num2;}
}// 上下文类
class Context {private Strategy strategy;public Context(Strategy strategy) {this.strategy = strategy;}public int executeStrategy(int num1, int num2) {return strategy.doOperation(num1, num2);}
}// 示例使用
public class StrategyPatternExample {public static void main(String[] args) {Context context = new Context(new AddStrategy());int result1 = context.executeStrategy(10, 5);System.out.println("10 + 5 = " + result1);  // 输出: 10 + 5 = 15context = new Context(new SubtractStrategy());int result2 = context.executeStrategy(10, 5);System.out.println("10 - 5 = " + result2);  // 输出: 10 - 5 = 5}
}

委派模式

委派模式(Delegate Pattern)又叫委托模式,是一种面向对象的设计模式,基本作用就是负责任务的调用和分配;是一种特殊的静态代理,可以理解为全权代理(代理模式注重过程,而委派模式注重结果),委派模式属于行为型模式,不属于GOF23种设计模式;

代码举例

// 委派接口
interface Printer {void print();
}// 具体委派类 - 打印机A
class PrinterA implements Printer {@Overridepublic void print() {System.out.println("Printer A is printing.");}
}// 具体委派类 - 打印机B
class PrinterB implements Printer {@Overridepublic void print() {System.out.println("Printer B is printing.");}
}// 委派类
class PrinterManager {private Printer printer;public void setPrinter(Printer printer) {this.printer = printer;}public void print() {printer.print();}
}// 示例使用
public class DelegatePatternExample {public static void main(String[] args) {PrinterManager printerManager = new PrinterManager();// 使用打印机APrinterA printerA = new PrinterA();printerManager.setPrinter(printerA);printerManager.print();  // 输出: Printer A is printing.System.out.println();// 使用打印机BPrinterB printerB = new PrinterB();printerManager.setPrinter(printerB);printerManager.print();  // 输出: Printer B is printing.}
}

适配器模式

适配器模式也比较简单,核心思想就是是:将一个类的接口转换成客户希望的另一个接口,讲白了就是通过适配器可以将原本不匹配、不兼容的接口或类结合起来;

代码举例

// 目标接口
interface Target {void request();
}// 适配者类
class Adaptee {public void specificRequest() {System.out.println("Specific request from Adaptee.");}
}// 适配器类
class Adapter implements Target {private Adaptee adaptee;public Adapter(Adaptee adaptee) {this.adaptee = adaptee;}@Overridepublic void request() {adaptee.specificRequest();}
}// 示例使用
public class AdapterPatternExample {public static void main(String[] args) {Adaptee adaptee = new Adaptee();Target adapter = new Adapter(adaptee);adapter.request();  // 输出: Specific request from Adaptee.}
}

相关文章:

原型,模板,策略,适配器模式

原型模式 原型模式&#xff08;创建型模式&#xff09;&#xff0c;核心思想就是&#xff1a;基于一个已有的对象复制一个对象出来&#xff0c;通过复制来减少对象的直接创建的成本。 总结一下&#xff0c;原型模式的两种方法&#xff0c;浅拷贝只会复制对象里面的基本数据类型…...

Ollama 在本地快速启动并执行LLM【大语言模型】

文章目录 1. 什么是Ollama?1.1. SDK库1.2. 提供的api服务1.3. [支持的LLM](https://ollama.com/library)2. 如何安装2.1.下载docker镜像2.2. 启动docker容器3. 如何使用?3.1. 如何加载模型3.2. 使用 Ollama CLI 进行推理3.3. 使用 Ollama API 进行推理参考1. 什么是Ollama?...

ubuntu : 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。

往后看&#xff0c;90%能解决你的问题 原文链接&#xff1a;学一下 (suxueit.com) 我相信很多人刚使用ubuntu都遇到过这个问题&#xff0c;如果没有遇到&#xff0c;可能是你运气好使用了正确的软件源 libprotobuf-dev : 依赖: zlib1g-dev 但是它将不会被安装 zlib1g-dev : 依…...

瑞芯微RK3576|触觉智能:开启科技新篇章

更多产品详情可关注深圳触觉智能官网&#xff01; “瑞芯微&#xff0c;创新不止步&#xff01;”——全新芯片RK3576即将震撼登场。指引科技风潮&#xff0c;创造未来无限可能&#xff01;这款芯片在瑞芯微不断创新和突破的道路上&#xff0c;不仅是对过往成就的完美延续&…...

Visual Studio 2013 - 清理

Visual Studio 2013 - 清理 1. 清理1.1. 工程清理1.2. 解决方案清理 References 1. 清理 Debug Release 1.1. 工程清理 (right mouse click on the project) -> 清理 1.2. 解决方案清理 (right mouse click on the solution) -> 清理解决方案 References [1] Yongq…...

1、初识JVM

一、JVM是什么&#xff1f; JVM的英文全称是 Java Virtual Machine&#xff0c;其中文译名为Java虚拟机。它在本质上就是是一个运行在计算机上的程序&#xff0c;他的职责是运行Java字节码文件。 JVM执行流程如下 二、JVM有哪些功能&#xff1f; 2.1 解释和运行 对字节码文…...

JavaScript 权威指南第七版(GPT 重译)(七)

第十六章&#xff1a;用 Node 进行服务器端 JavaScript Node 是 JavaScript 与底层操作系统的绑定&#xff0c;使得编写 JavaScript 程序读写文件、执行子进程和在网络上通信成为可能。这使得 Node 作为以下用途变得有用&#xff1a; 现代替代 shell 脚本的方式&#xff0c;不…...

从零开始搭建游戏服务器 第四节 MongoDB引入并实现注册登录

目录 前言正文添加依赖安装MongoDB添加MongoDB相关配置创建MongoContext类尝试初始化DB连接实现注册功能测试注册功能实现登录逻辑测试登录流程 结语下节预告 前言 游戏服务器中, 很重要的一点就是如何保存玩家的游戏数据. 当一个服务端架构趋于稳定且功能全面, 开发者会发现服…...

【Unity】宏定义Scripting Define Symbols

1.宏的用处 我们在使用Unity开发的时候&#xff0c;经常需要根据不同环境执行不同的代码 比如安卓手机和苹果手机获取路径代码 这个时候&#xff0c;宏就派上用场了。 代码示例&#xff1a; //获取路径public string GtePath(){//不同平台&#xff0c;取不同的存储路径string…...

算法 之 排序算法

&#x1f389;欢迎大家观看AUGENSTERN_dc的文章(o゜▽゜)o☆✨✨ &#x1f389;感谢各位读者在百忙之中抽出时间来垂阅我的文章&#xff0c;我会尽我所能向的大家分享我的知识和经验&#x1f4d6; &#x1f389;希望我们在一篇篇的文章中能够共同进步&#xff01;&#xff01;&…...

Prism:打造WPF项目的MVVM之选,简化开发流程、提高可维护性

概述&#xff1a;探索WPF开发新境界&#xff0c;借助Prism MVVM库&#xff0c;实现模块化、可维护的项目。强大的命令系统、松耦合通信、内置导航&#xff0c;让您的开发更高效、更流畅 在WPF开发中&#xff0c;一个优秀的MVVM库是Prism。以下是Prism的优点以及基本应用示例&a…...

Springboot+vue的四川美食分享网站+数据库+报告+免费远程调试

项目介绍: Springbootvue的四川美食分享网站。Javaee项目&#xff0c;springboot vue前后端分离项目 本文设计了一个基于Springbootvue的前后端分离的四川美食分享网站&#xff0c;采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&am…...

温湿度项目V1.0——原理图设计

工程 首先要有安装好的Altium Designer软件。新建工程&#xff0c;添加sch、pcb文件&#xff1b;新建原理图库和PCB库。画原理图之前应该要有自己的原理库&#xff0c;可以从自己的原理图库中拖元器件到原理图中。那么就要先画原理图库的元器件&#xff0c;再画该元器件的封装…...

H5 与 App、网页之间的通信

前言 本文整理工作中 H5 嵌入 Android、iOS 与 PC 网页后&#xff0c;如何与各端通信。&#xff08;提供 H5 端的代码&#xff09; 环境判断 const ua navigator.userAgent.toLowerCase()const isAndroid /android/i.test(ua)const isIos /iphone|ipod|ios/i.test(ua)cons…...

亚马逊云科技:企业如何开启生成式AI之旅?

如果要评选最近两年全球科技行业最热门的细分领域&#xff0c;那么生成式AI绝对会以遥遥领先的票数成为当仁不让的冠军。 然而眼见生成式AI发展得如火如荼&#xff0c;越来越多的企业却陷入了深深的焦虑&#xff1a;应该如何开启生成式AI之旅&#xff1f;又该怎样搭建大模型&am…...

AMPQ和rabbitMQ

RabbitMQ 的 Channel、Connection、Queue 和 Exchange 都是按照 AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;标准实现的。 AMPQ的网络部分 AMQP没有使用HTTP&#xff0c;使用TCP自己实现了应用层协议。 AMQP实现了自己特有的网络帧格式。 一个Connection…...

在存在代理的主机上,为docker容器配置代理

1、配置Firefox的代理 (只配置域名或者ip&#xff0c;前面不加http://) 2、为容器中的Git配置代理 git config --global http.proxy http://qingteng:8080 3、Git下载时忽略证书校验 env GIT_SSL_NO_VERIFYtrue git clone https://github.com/nginx/nginx.git 4、docker的…...

备考ICA----Istio实验4---使用 Istio 进行金丝雀部署

备考ICA----Istio实验4—使用 Istio 进行金丝雀部署 上一个实验已经通过DestinationRule实现了部分金丝雀部署的功能,这个实验会更完整的模拟展示一个环境由v1慢慢过渡到v2版本的金丝雀发布. 1. 环境清理 kubectl delete gw/helloworld-gateway vs/helloworld dr/helloworld…...

LeetCode-热题100:39.组合总和

题目描述 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重复被…...

演讲嘉宾公布 | 智能家居与会议系统专题论坛将于3月28日举办

一、智能家居与会议系统专题论坛 智能家居通过集成先进的技术和设备&#xff0c;为人们提供了更安全、舒适、高效、便捷且多彩的生活体验。智能会议系统它通过先进的技术手段&#xff0c;提高了会议效率&#xff0c;降低了沟通成本&#xff0c;提升了参会者的会议体验。对于现代…...

向华为学习——解读华为战略执行全解码从规划到行动的DSTE与BLM模型集成应用方案【附全文阅读】

华为通过DSTE流程与BLM模型集成,实现战略从规划到执行的全流程管理。DSTE构建战略执行时间轴,BLM模型提供战略制定到执行框架,两者协同将长期规划拆解为年度计划,并通过绩效与资源保障闭环落地[4]。 关联阅读索引: 收藏不迷路——耗时三天完成整理 华为IPD流程体系战略解码…...

从串行到并行:构建一个可控加减法器的高效设计实践

1. 从串行到并行&#xff1a;加减法器的设计演进之路 记得我第一次接触加法器设计时&#xff0c;对着教科书上的串行电路图发呆了整整一个下午。那些密密麻麻的连线就像一团乱麻&#xff0c;完全看不出为什么这样连接就能实现加法运算。直到后来自己动手搭建了一个4位串行加法器…...

PHP安全漏洞之文件包含与SSRF攻击全解析

在Web安全领域&#xff0c;PHP应用程序的安全问题一直备受关注。本文将深入探讨两种常见的PHP安全漏洞&#xff1a;文件包含漏洞和服务器端请求伪造(SSRF)&#xff0c;帮助开发者理解漏洞原理、利用方式以及防御措施。 第一部分&#xff1a;文件包含漏洞详解 什么是文件包含漏洞…...

Andrej Karpathy四大AI编程原则:远程团队协作效率提升指南 [特殊字符]

Andrej Karpathy四大AI编程原则&#xff1a;远程团队协作效率提升指南 &#x1f680; 【免费下载链接】andrej-karpathy-skills 项目地址: https://gitcode.com/GitHub_Trending/an/andrej-karpathy-skills 在当今分布式工作时代&#xff0c;远程团队协作已成为软件开发…...

深入解密 JVM:CMS 垃圾回收器的“并发标记”到底是不是多此一举?

深入解密 JVM&#xff1a;CMS 垃圾回收器的“并发标记”到底是不是多此一举&#xff1f; 在学习 JVM 垃圾回收机制时&#xff0c;很多开发者在看到 CMS (Concurrent Mark Sweep) 垃圾回收器的执行步骤图时&#xff0c;都会产生一个直击灵魂的疑问&#xff1a;“初始标记和重新标…...

原神帧率解锁指南:3步突破60FPS限制,释放硬件全部性能!

原神帧率解锁指南&#xff1a;3步突破60FPS限制&#xff0c;释放硬件全部性能&#xff01; 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 还在为《原神》的60帧上限而烦恼吗&#xff1f…...

PyTorch 笔记学习(15) : aot_autograd.py 解析

本文是 聚焦 torch/_functorch/aot_autograd.py 这一 1863 行的关键文件。它是 torch.compile 编译栈中承上启下的核心枢纽——向上承接 TorchDynamo 捕获的 FX 图&#xff0c;向下将前向/反向图交付给 Inductor 代码生成后端。理解这个文件&#xff0c;就掌握了 PyTorch 2.0 编…...

被“乖乖”洗脑了?《家事法庭》那个“中年油腻男”,竟是剧抛脸老熟人!

近日&#xff0c;聚焦家事审判的法院题材电视剧《家事法庭》正式登陆央视一套黄金档及多家网络平台。自3月25日开播以来&#xff0c;该剧凭借对民生百态的深刻刻画以及一众实力派演员的精湛演绎&#xff0c;迅速引爆收视与口碑热潮。剧中&#xff0c;演员郭家诺饰演的何秀光一角…...

Llama Factory零代码微调大模型:5分钟上手Qwen实战教程

Llama Factory零代码微调大模型&#xff1a;5分钟上手Qwen实战教程 1. 前言&#xff1a;为什么选择Llama Factory&#xff1f; 大模型微调一直是AI工程师的必备技能&#xff0c;但传统方法需要编写大量代码&#xff0c;配置复杂环境&#xff0c;让很多初学者望而却步。Llama …...

Notepad++ 插件构想:集成Phi-4-mini-reasoning实现轻量级代码智能

Notepad 插件构想&#xff1a;集成Phi-4-mini-reasoning实现轻量级代码智能 1. 为什么Notepad需要AI插件 作为一个经典的轻量级文本编辑器&#xff0c;Notepad凭借其简洁高效的特点赢得了全球开发者的喜爱。但随着AI技术的快速发展&#xff0c;传统编辑器在代码智能辅助方面的…...