设计模式——设计模式原则
设计模式
设计模式示例代码库地址:
https://gitee.com/Jasonpupil/designPatterns
设计模式原则
单一职责原则(SPS):
-
又称单一功能原则,面向对象五个基本原则(SOLID)之一
-
原则定义:一个类应该只有一个发生变化的原因
-
使用
if else进行判断实现不好维护 -
模式场景:视频网站,存在
访客用户(视频480p高清,并有广告)、普通用户(视频720p超清,并有广告)和VIP用户(视频1080p蓝光,没有广告)if else处理方式示例代码:
/*** @Description: 视频用户服务* @Author: pupil* @Date: 2024/06/21 下午 8:12*/ public class VideoUserService {public void serveGrade(String userType){if ("VIP用户".equals(userType)){System.out.println("VIP用户,视频1080p蓝光");}else if ("普通用户".equals(userType)){System.out.println("普通用户,视频720p超清");}else if ("访客用户".equals(userType)){System.out.println("访客用户,视频480p高清");}} }/*** @description:测试验证* @author: pupil* @data: 2024/06/21 下午 7:57*/ public class ApiTest {public static void main(String[] args) {VideoUserService service = new VideoUserService();service.serveGrade("VIP用户");service.serveGrade("普通用户");service.serveGrade("访客用户");} }结果:

- 根据
单一职责原则处理方式示例代码:
/*** @Description: 视频用户服务接口* @Author: pupil* @Date: 2024/06/21 下午 8:17*/ public interface IVideoUserService {void definition();void advertisement(); }/*** @Description: 访客用户* @Author: pupil* @Date: 2024/06/21 下午 8:18*/ public class GuestVideoUserServiceImpl implements IVideoUserService {@Overridepublic void definition() {System.out.println("访客用户,视频480p超清");}@Overridepublic void advertisement() {System.out.println("访客用户,视频有广告");} }/*** @Description: 普通用户* @Author: pupil* @Date: 2024/06/21 下午 8:19*/ public class OrdinaryVideoUserServiceImpl implements IVideoUserService {@Overridepublic void definition() {System.out.println("普通用户,视频720p超清");}@Overridepublic void advertisement() {System.out.println("普通用户,视频有广告");} }/*** @Description: VIP用户* @Author: pupil* @Date: 2024/06/21 下午 8:20*/ public class VipVideoUserServiceImpl implements IVideoUserService {@Overridepublic void definition() {System.out.println("VIP用户,视频1080p蓝光");}@Overridepublic void advertisement() {System.out.println("VIP会员,视频无广告");} }/*** @Description: 测试验证* @Author: pupil* @Date: 2024/06/21 下午 8:24*/ public class ApiTest {public static void main(String[] args) {IVideoUserService guest = new GuestVideoUserServiceImpl();guest.definition();guest.advertisement();System.out.println("=================================");IVideoUserService ordinary= new OrdinaryVideoUserServiceImpl();ordinary.definition();ordinary.advertisement();System.out.println("=================================");IVideoUserService vip = new VipVideoUserServiceImpl();vip.definition();vip.advertisement();} }结果:

根据单一职责原则的示例类图:

接口和类是实现关系
开闭原则
-
开闭原则规定“软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的”
-
让类依赖于固定的抽象,所以对修改是封闭的
-
而通过面向对象的继承和多态机制,可以实现对抽象体的继承,通过覆写其方法来改变固有行为,实现新的扩展方法,所以对于扩展就是开放的
-
提高复用性:
- 通过抽象提高灵活性:使用抽象类或接口定义功能,使具体实现可以灵活替换。这种方法允许开发者在不改变现有代码的基础上增加新功能。
- 减少代码重复:将通用的行为放在基类或接口中,具体实现类通过继承和实现来扩展这些行为。这减少了重复代码的出现,使代码更易于维护和复用。
-
提高维护性:
- 降低风险:增加新功能时无需修改现有代码,减少引入新错误的风险,增强系统稳定性
- 独立测试:模块更加独立,便于单独测试和调试。接口测试确保所有实现类符合预期行为,只需测试新代码
- 职责单一:各模块职责明确,代码结构清晰,便于理解和修改,开发人员能快速找到扩展点。
-
使用场景:支付方式,
进行付款时存在不同的付款方式,在已有的微信支付的方式上新添加根据金额自动选择微信余额支付还是绑定的银行卡支付示例代码:
/*** @Description: 支付处理接口* @Author: pupil* @Date: 2024/06/22 下午 9:25*/ public interface PaymentProcessor {void processPayment(double amount); }/*** @Description: 微信支付* @Author: pupil* @Date: 2024/06/22 下午 9:49*/ public class WeChatProcessor implements PaymentProcessor {@Overridepublic void processPayment(double amount) {System.out.println("使用微信余额支付");} }/*** @Description: 扩展微信支付,添加从银行卡扣钱* @Author: pupil* @Date: 2024/06/22 下午 9:33*/ public class BankCardProcessor extends WeChatProcessor {/*** 当amount大于100时用银行卡支付* @param amount*/@Overridepublic void processPayment(double amount) {if (amount<=100){System.out.println("使用微信余额支付");}else {System.out.println("使用银行卡支付");}}}/*** @Description: PayPal支付实现* @Author: pupil* @Date: 2024/06/22 下午 9:49*/ public class PayPalProcessor implements PaymentProcessor {@Overridepublic void processPayment(double amount) {System.out.println("使用PayPal支付");} }/*** @Description: 测试验证* @Author: pupil* @Date: 2024/06/21 下午 8:13*/ public class ApiTest {@Testpublic void test_BankCardProcessor(){PaymentProcessor processor = new BankCardProcessor();processor.processPayment(150);processor.processPayment(90);}@Testpublic void test_WeChatProcessor(){PaymentProcessor processor = new WeChatProcessor();processor.processPayment(150);}@Testpublic void test_PayPalProcessor(){PaymentProcessor processor = new PayPalProcessor();processor.processPayment(150);}}结果:
-
微信支付类的扩展类:

-
微信支付类:

-
根据开闭原则的示例类图:

微信支付类和PayPal支付类与支付接口是实现关系
微信支付类与微信支付扩展类是泛化关系
其他原则待完成…
相关文章:
设计模式——设计模式原则
设计模式 设计模式示例代码库地址: https://gitee.com/Jasonpupil/designPatterns 设计模式原则 单一职责原则(SPS): 又称单一功能原则,面向对象五个基本原则(SOLID)之一 原则定义…...
链表中环的入口节点
链表中环的入口节点 描述 链表中环的入口节点 给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。 数据范围: n≤10000, 1<结点值<10000 要求:空间复杂度 O(1)…...
STL——函数对象,谓词
一、函数对象 1.函数对象概念 概念: 重载函数调用操作符的类,其对象常称为函数对象。 函数对象使用重载的()时,行为类似函数调用,也叫仿函数。 本质: 函数对象(仿函数)是一个类,不是一个函数。 2.函数对象…...
【区分vue2和vue3下的element UI Descriptions 描述列表组件,分别详细介绍属性,事件,方法如何使用,并举例】
在 Element UI(为 Vue 2 设计)和 Element Plus(为 Vue 3 设计)中,Descriptions(描述列表)组件通常用于展示一系列的结构化信息。然而,需要明确的是,Element UI 官方库中并…...
atcoder abc 358
A welcome to AtCoder Land 题目: 思路:字符串比较 代码: #include <bits/stdc.h>using namespace std;int main() {string a, b;cin >> a >> b;if(a "AtCoder" && b "Land") cout <&…...
手写docker:你先玩转namespace再来吧
哈喽,我是子牙老师。今天咱们聊聊Linux namespace 瓦特?你没听过namespace?那有必要科普一下了:namespace是Linux内核提供的一种软件性质的资源隔离机制。容器化技术,比如docker,就是基于这样的机制实现的…...
注册安全分析报告:PingPong
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞 …...
mysqladmin——MySQL Server管理程序(二)
mysqladmin 是一个命令行工具,用于执行简单的 MySQL 服务器管理任务,如检查服务器的状态、创建和删除数据库、重载权限等。 1 reload 重新加载授权表(grant tables)。当修改了MySQL的权限系统(例如,修改了…...
Microsoft Edge无法启动搜索问题的解决
今天本来想清一下电脑,看到visual studio2022没怎么用了就打算卸载掉。然后看到网上有篇文章说进入C盘的ProgramFiles(x86)目录下的microsoft目录下的microsoft visual studio目录下的install目录中,双击InstallCleanup.exe&#…...
Appium Android 自动化测试 -- 元素定位
自动化测试元素定位是难点之一,编写脚本时会经常卡在元素定位这里,有时一个元素能捣鼓一天,到最后还是定位不到。 Appium 定位方式和 selenium 一脉相承,selenium 中的定位方式Appium 中都支持,而 Appium 还增加了自己…...
C#.net6.0+Vue+Ant-Design智慧医院手术麻醉系统源码 手术麻醉软件信息化管理系统 麻醉文书祥解
C#.net6.0VueAnt-Design智慧医院手术麻醉系统源码 手术麻醉软件信息化管理系统 麻醉文书祥解 医护人员通过手麻信息系统可以进行手术的预约申请、受理、安排,从门诊医生下医嘱到发起手术申请、护士长审核通过,均实现了全流程信息化管理,大大…...
6G时代,即将来临!
日前,由未来移动通信论坛、紫金山实验室主办的2024全球6G技术大会在南京召开。本次大会以“创新预见6G未来”为主题,在大会开幕式上发布了协力推进全球6G统一标准行动的倡议和紫金山科技城加速培育以6G技术引领未来产业行动计划。 在我国已开展第五代移动…...
进程、线程的区别
进程、线程的关系 开工厂生产手机,制作一条生产线,这个生产线上有很多的器件以及材料。一条生产线就是一个进程。 只有生产线是不够的,使用找五个工人来进行生产,这个工人能够利用这些材料最终一步步的将手机做出来,这…...
JWT详解、JWTUtil工具类的构建方法
一、前言 使用一些用户不友好的项目时,会发现,每一次进入网站,我们都要重新登录。 这是为什么呢? 现代多采用前后端分离的项目架构,这种架构,前后端使用不同的服务器,两个服务器上存储的信息不…...
江协科技51单片机学习- p11 静态数码管显示
前言: 本文是根据哔哩哔哩网站上“江协科技51单片机”视频的学习笔记,在这里会记录下江协科技51单片机开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技51单片机教学视频和链接中的内容。 引用: 51单片机入门教程-2…...
pandas.frame输出parquet
代码 import pandas as pd import pyarrow._parquet as pqdata pd.read_parquet("0000.parquet") total_rows len(data) half_row_num total_rows//2 print(half_row_num) first_half data.iloc[:20000] second_half data.iloc[20000:20000] # print(first_hal…...
【CT】LeetCode手撕—42. 接雨水
目录 题目1- 思路2- 实现⭐42. 接雨水——题解思路 3- ACM实现 题目 原题连接:42. 接雨水 1- 思路 模式识别:求雨水的面积 ——> 不仅是只求一个比当前元素大的元素,还要求面积 单调栈 应用场景,需要找到左边比当前元素大的…...
GPT-4o一夜被赶超,Claude 3.5一夜封王|快手可灵大模型推出图生视频功能|“纯血”鸿蒙大战苹果AI|智谱AI“钱途”黯淡|月之暗面被曝进军美国
快手可灵大模型推出图生视频功能“纯血”鸿蒙大战苹果AI,华为成败在此一举大模型低价火拼间,智谱AI“钱途”黯淡手握新“王者”,腾讯又跟渠道干上了“美食荒漠”杭州,走出一个餐饮IPOGPT-4o一夜被赶超,Anthropic推出Cl…...
C# + easyui 写的一个web项目
用C# easyui 来开发,其实就是为了开发速度,用easyui可以一天写很多页面,比一些低代码平台还快。 登陆页面 主界面 记录数统计 家庭信息采集表 新建家庭 家庭成员 低保、五保人员帮扶情况登记表 低保、五保人员帮扶情况登记表的新增和编辑 治…...
JVM 垃圾回收分配及算法
一、判断对象是否可以回收 垃圾收集器在做垃圾回收的时候,首先需要判定的就是哪些内存是需要被回收 的,哪些对象是「存活」的,是不可以被回收的;哪些对象已经「死掉」了,需 要被回收。 一般有两种方法来判断ÿ…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
