规约模式:优雅设计与灵活应用
引言:
规约模式是软件开发中的重要设计原则,它们提供了一种优雅的、灵活的方式来构建高质量的系统。本文将通过实例演示规约模式的具体应用,带你了解这些原则的实战价值。
一、开放封闭原则
// 图形接口
public interface Shape {void draw();
}// 圆形类
public class Circle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a circle.");}
}// 矩形类
public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a rectangle.");}
}// 绘图应用类
public class DrawingApp {public void drawShape(Shape shape) {shape.draw();}
}
在上述代码中,我们定义了一个图形接口 Shape,并为每种图形类型创建了实现类 Circle 和 Rectangle。在绘图应用类 DrawingApp 中,我们可以调用 drawShape 方法来绘制不同类型的图形,而无需修改已有代码。
二、单一职责原则
// 文件上传类
public class FileUploader {public void uploadFile(File file) {// 实现文件上传逻辑}
}// 文件保存类
public class FileSaver {public void saveFile(File file) {// 实现文件保存逻辑}
}
在上述代码中,我们将文件上传和文件保存两个功能分别封装在了不同的类中,每个类只负责单一职责。这样做有助于代码的复用和维护,使系统更加健壮和灵活。
三、依赖倒置原则
// 通知接口
public interface Notification {void sendNotification(String message);
}// 邮件通知类
public class EmailNotification implements Notification {@Overridepublic void sendNotification(String message) {// 实现发送邮件通知的逻辑}
}// 短信通知类
public class SMSNotification implements Notification {@Overridepublic void sendNotification(String message) {// 实现发送短信通知的逻辑}
}// 订单处理类
public class OrderProcessor {private final Notification notification;public OrderProcessor(Notification notification) {this.notification = notification;}public void processOrder(Order order) {// 处理订单逻辑notification.sendNotification("Your order has been processed.");}
}
在上述代码中,我们使用依赖倒置原则来实现订单处理系统的通知功能。订单处理类 OrderProcessor 依赖于通知接口 Notification 而不是具体的实现类,这样可以轻松切换不同的通知方式,而不影响订单处理逻辑。
四、迪米特法则
考虑一个图书馆管理系统,图书馆管理员需要查看读者的借阅信息。根据迪米特法则,我们应该尽量减少图书馆管理员和读者之间的直接交互。
public class Reader {private String name;private List<Book> borrowedBooks;// getter and setter methods
}public class Library {private List<Reader> readers;public List<Book> getBorrowedBooks(Reader reader) {return reader.getBorrowedBooks();}
}
五、接口隔离原则
假设我们有一个权限管理系统,其中包含管理员、普通用户和游客三种角色。为了遵循接口隔离原则,我们应该为每种角色创建独立的接口,只包含其所需的方法。
public interface Admin {void manageUsers();
}public interface User {void viewProfile();
}public interface Guest {void viewHomePage();
}public class AdminUser implements Admin, User {// 实现管理员和用户的接口方法
}public class RegularUser implements User {// 实现普通用户的接口方法
}public class GuestUser implements Guest {// 实现游客的接口方法
}
这样做有助于避免不必要的接口依赖,提高系统的灵活性和可扩展性。
相关文章:
规约模式:优雅设计与灵活应用
引言: 规约模式是软件开发中的重要设计原则,它们提供了一种优雅的、灵活的方式来构建高质量的系统。本文将通过实例演示规约模式的具体应用,带你了解这些原则的实战价值。 一、开放封闭原则 // 图形接口 public interface Shape {void dra…...
Ubuntu Server版 之 apache系列 安装、重启、开启,版本查看
安装之前首先要检测是否安装过 apt list --installed | grep tool tool:要检测的名称,如mysql、apache 、ngnix 等 安装 apache sudo apt install apache2 安装apache 默认是开启的 可以通过浏览器 检测一下 service apache stop # apache 停止服务…...
Redis学习路线(4)—— Redis实现项目缓存
一、什么是缓存 (一)概念:缓存就是数据交换的缓冲区(称为Cache),是存储数据的临时区域,一般读写性能较高。 (二)常见缓存: 浏览器缓存,服务器缓…...
【Unity造轮子】实现一个类csgo的武器轮盘功能
文章目录 前言素材导入开始1.放背景和中间的圆圈,调整合适的宽高和位置2.添加选择图像框3.添加一些武器道具选择4.书写脚本RadialMenuManager5.绑定脚本和对象6.运行效果,按tab键开启关闭轮盘7.优化添加显示选中的武器文本8.添加鼠标选中放大的效果9.添加…...
代码随想录算法训练营第三十天 | 单调栈系列复习
单调栈系列复习 每日温度未看解答自己编写的青春版重点题解的代码日后再次复习重新写 下一个更大元素 I未看解答自己编写的青春版重点题解的代码日后再次复习重新写 下一个更大元素II未看解答自己编写的青春版重点题解的代码日后再次复习重新写 接雨水未看解答自己编写的青春版…...
redis数据未到过期时间被删除
1. 问题描述 使用了jeecgboot开发后端代码,代码设置的redis过期时间为24小时,部署使用的宝塔面板,在redis中看到的过期时间也是为24小时,但是并未到过期时间,数据就被删除。 2. 解决办法 观察了一下redis中的数据&a…...
32.选择器
选择器 html部分 <div class"toggle-container"><input type"checkbox" id"good" class"toggle"><label for"good" class"label"><div class"ball"></div></label&…...
Linux--验证命令行上运行的程序的父进程是bash
1.输入以下代码: #include <stdio.h> #include <unistd.h> int main() {printf("hello world: pid: %d, ppid: %d\n",getpid(),getppid());return 0; }2.编译得到可执行程序 3.运行得到ppid 4.输入指令 ps axj | head -1 &&am…...
MySQL数据库关于表的一系列操作
MySQL中的数据类型 varchar 动态字符串类型(最长255位),可以根据实际长度来动态分配空间,例如:varchar(100) char 定长字符串(最长255位),存储空间是固定的,例如&#…...
Spring基于注解管理bean及全注解开发
文章目录 spring概述Spring定义Spring核心Spring Framework的特点 基于注解管理bean依赖开启组件扫描使用注解定义Bean案例:Autowired注入属性注入set注入形参上注入只有一个构造函数,无注解Autowire注解和Qualifier注解联合 Resource注入Spring全注解开发 spring概…...
QtC++ 技术分析3 - IOStream
目录 iostreamscanf/printfiostream 整体架构流相关类流缓冲区 模板特化后整体结构文件流文件流对象创建常见文件流操作输出格式设定文件流状态 字符串流字符串流内部缓冲区字符串流使用 流缓冲区用户自定义 IO iostream scanf/printf 几种常见的输入输出流函数 scanf 从键盘…...
2023年Q2京东环境电器市场数据分析(京东数据产品)
今年Q2,环境电器市场中不少类目表现亮眼,尤其是以净水器、空气净化器、除湿机等为代表的环境健康电器。此外,像冷风扇这类具有强季节性特征的电器也呈现出比较好的增长态势。 接下来,结合具体数据我们一起来分析Q2环境电器市场中…...
TCP/UDP的首部
TCP/UDP首部信息 TCP首部第一个4字节第二个4字节与第三个4字节第四个4字节第五个4字节选项最大报文段长度(MSS)选项窗口扩大选项时间戳选项 什么时候发送RST包UDP首部 TCP首部 TCP 首部长度为20字节,加上选项部分最大可达60字节。 第一个4…...
Kubernetes(K8s)从入门到精通系列之四:K8s的基本概念和术语之集群类
Kubernetes K8s从入门到精通系列之四:K8s的基本概念和术语之集群类 一、Master二、Node三、命名空间集群表示一个由Master和Node组成的K8s集群。 一、Master Master指的是集群的控制节点。在每个K8s集群都需要有一个或一组被称为Master的节点,来负责整个集群的管理和控制。M…...
黑马头条---day1
手机端查看 docker 容器,镜像操作命令 1、docker删除所有镜像命令 删除所有镜像的命令是Docker中一个非常常见的操作。下面是具体的实现步骤和命令示例: $ docker stop $(docker ps -aq) 停止所有正在运行的容器。 $ docker rm $(docker ps -aq) 删…...
【序列化工具JdkSerialize和Protostuff】
序列化工具对比 JdkSerialize:java内置的序列化能将实现了Serilazable接口的对象进行序列化和反序列化, ObjectOutputStream的writeObject()方法可序列化对象生成字节数组 Protostuff:google开源的protostuff采用更为紧凑的二进制数组&#…...
C++ 多线程编程导论(下)
文章目录 参考资料线程安全(续)门闩与屏障——latch 对象与 barrier 对象门闩(latch)屏障(barrier) 一次性调用——once_flag 对象与 call_once 函数 异步任务未来与承诺——future 对象与 promise 对象fut…...
Java并发系列之一:JVM线程模型
什么是线程模型: Java字节码运行在JVM中,JVM运行在各个操作系统上。所以当JVM想要进行线程创建回收这种操作时,势必需要调用操作系统的相关接口。也就是说,JVM线程与操作系统线程之间存在着某种映射关系,这两种不同维…...
容灾独家技术揭秘:HyperBDR无主机数据同步技术
01、一对一单机热备-传统灾备方式 单机热备是一种备份解决方案,它使用两台服务器来确保高可用性,是市场上最为常见的灾备模式。 在单机热备中,一台主服务器和一台备用服务器保持同步,以确保在主服务器出现故障或宕机时可以立即切换…...
FANUC机器人SRVO-050碰撞检测报警和SRVO-053干扰值过大故障报警总结
FANUC机器人SRVO-050碰撞检测报警和SRVO-053干扰值过大故障报警总结 前面和大家分享了关于SRVO-050碰撞检测报警和SRVO-053干扰值过大的原因分析以及处理方法,感兴趣的朋友可以参考以下链接中的内容: FANUC机器人SRVO-050碰撞检测报警原因分析及处理对策...
An-Labeler:AudioLabellerV3 AI 辅助标注工具详解(自研Qt + FFT/模型自动标注)
An-Labeler V3:AudioLabeller AI 辅助标注工具详解(自研Qt + FFT/模型自动标注) Author: Code-keys (qq_37445230) Version: V3 (2026-03) 系列文章: An-Labeler:AudioLabeller 高效音视频标注工具 [AAn-Labeler:AudioLabellerV3 AI 辅助标注工具详解] 一、V3 版本更新概…...
SimWorks FDTD仿真结果可视化:从监视器数据到专业图表,手把手教你避开插值陷阱
SimWorks FDTD仿真结果可视化:从监视器数据到专业图表,手把手教你避开插值陷阱 电磁仿真工程师们常遇到这样的困境:明明仿真设置无误,计算结果却与预期存在微妙差异。问题的根源往往不在仿真过程本身,而在于后处理阶段…...
【硬件小达人-基础篇(1)】-电阻那些事儿
文章目录什么是电阻电阻的功率一定要降额使用电阻的额定电压和精度额定电压精度PCB设计中,电阻的作用1.限流电阻保护敏感元件常用经验2.分压电阻电压反馈ADC采集电路一些经验3.分流电阻4.上拉电阻/下拉电阻什么是上下拉作用一、 防止引脚悬空,消除外部干…...
2.5m双馈风力发电机DFIG的带储能Simulink电气建模与仿真(参数源自IEEE3)”
2.5m双馈风力发电机DFIG并网_带储能的simulink电气建模与仿真,参数来自IEEE3半夜两点盯着Simulink界面眼冒绿光,手里的咖啡已经续到第五杯——这大概每个搞风电建模的工程师都经历过的场景。今天咱们就唠唠这个让人又爱又恨的2.5MW双馈风机并网模型&…...
BetterNCM安装器终极指南:3分钟搞定网易云音乐插件管理
BetterNCM安装器终极指南:3分钟搞定网易云音乐插件管理 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer BetterNCM安装器是一款专为PC版网易云音乐用户设计的强大插件管理器…...
公共部门人力资源管理、公共行政学、公共经济学(自考速记核心概念)
公共部门人力资源管理、公共行政学、公共经济学(自考速记核心概念) 第一页(核心基础规划与获取) 一、核心基础概念(必背) 1.公共部门人力资源管理:公共部门(政府、事业单位、非营…...
量化交易开发实战指南:从入门到部署
量化交易开发实战指南:从入门到部署 【免费下载链接】StockSharp Algorithmic trading and quantitative trading open source platform to develop trading robots (stock markets, forex, crypto, bitcoins, and options). 项目地址: https://gitcode.com/gh_mi…...
告别重复劳动,用快马平台ai高效生成openclaw自动化脚本
最近在折腾一些文件批量处理的自动化任务,发现OpenClaw这个命令行工具特别适合做这类工作。但每次都要手动敲命令实在太费时间了,特别是需要组合多个命令的时候,调试起来特别麻烦。后来发现了InsCode(快马)平台,用它来编写OpenCla…...
AI 学习笔记:LLM 的部署与测试
关于 LLM 的本地部署 正如我之前在《[[关于 AI 的学习路线图]]》一文中所提到的,从学习的角度来说,如果我们要想切实了解 LLM 在计算机软件系统中所处的位置,以及它在生产环境中所扮演的角色,最直接的方式就是尝试将其部署到我们…...
Rust会议活动awesome-rust:技术大会与社区聚会信息
Rust会议活动awesome-rust:技术大会与社区聚会信息 你是否还在为寻找Rust技术大会与社区聚会信息而烦恼?是否希望能一站式获取全球Rust相关活动,与同行交流学习?本文将为你详细介绍如何通过awesome-rust项目了解和参与Rust会议活…...
