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

设计模式——设计模式原则

设计模式

设计模式示例代码库地址:

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支付类与支付接口是实现关系

微信支付类与微信支付扩展类是泛化关系

其他原则待完成…

相关文章:

设计模式——设计模式原则

设计模式 设计模式示例代码库地址&#xff1a; https://gitee.com/Jasonpupil/designPatterns 设计模式原则 单一职责原则&#xff08;SPS&#xff09;&#xff1a; 又称单一功能原则&#xff0c;面向对象五个基本原则&#xff08;SOLID&#xff09;之一 原则定义&#xf…...

链表中环的入口节点

链表中环的入口节点 描述 链表中环的入口节点 给一个长度为n链表&#xff0c;若其中包含环&#xff0c;请找出该链表的环的入口结点&#xff0c;否则&#xff0c;返回null。 数据范围&#xff1a; n≤10000&#xff0c; 1<结点值<10000 要求&#xff1a;空间复杂度 O(1)…...

STL——函数对象,谓词

一、函数对象 1.函数对象概念 概念&#xff1a; 重载函数调用操作符的类&#xff0c;其对象常称为函数对象。 函数对象使用重载的()时&#xff0c;行为类似函数调用&#xff0c;也叫仿函数。 本质&#xff1a; 函数对象(仿函数)是一个类&#xff0c;不是一个函数。 2.函数对象…...

【区分vue2和vue3下的element UI Descriptions 描述列表组件,分别详细介绍属性,事件,方法如何使用,并举例】

在 Element UI&#xff08;为 Vue 2 设计&#xff09;和 Element Plus&#xff08;为 Vue 3 设计&#xff09;中&#xff0c;Descriptions&#xff08;描述列表&#xff09;组件通常用于展示一系列的结构化信息。然而&#xff0c;需要明确的是&#xff0c;Element UI 官方库中并…...

atcoder abc 358

A welcome to AtCoder Land 题目&#xff1a; 思路&#xff1a;字符串比较 代码&#xff1a; #include <bits/stdc.h>using namespace std;int main() {string a, b;cin >> a >> b;if(a "AtCoder" && b "Land") cout <&…...

手写docker:你先玩转namespace再来吧

哈喽&#xff0c;我是子牙老师。今天咱们聊聊Linux namespace 瓦特&#xff1f;你没听过namespace&#xff1f;那有必要科普一下了&#xff1a;namespace是Linux内核提供的一种软件性质的资源隔离机制。容器化技术&#xff0c;比如docker&#xff0c;就是基于这样的机制实现的…...

注册安全分析报告:PingPong

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞 …...

mysqladmin——MySQL Server管理程序(二)

mysqladmin 是一个命令行工具&#xff0c;用于执行简单的 MySQL 服务器管理任务&#xff0c;如检查服务器的状态、创建和删除数据库、重载权限等。 1 reload 重新加载授权表&#xff08;grant tables&#xff09;。当修改了MySQL的权限系统&#xff08;例如&#xff0c;修改了…...

Microsoft Edge无法启动搜索问题的解决

今天本来想清一下电脑&#xff0c;看到visual studio2022没怎么用了就打算卸载掉。然后看到网上有篇文章说进入C盘的ProgramFiles&#xff08;x86&#xff09;目录下的microsoft目录下的microsoft visual studio目录下的install目录中&#xff0c;双击InstallCleanup.exe&#…...

Appium Android 自动化测试 -- 元素定位

自动化测试元素定位是难点之一&#xff0c;编写脚本时会经常卡在元素定位这里&#xff0c;有时一个元素能捣鼓一天&#xff0c;到最后还是定位不到。 Appium 定位方式和 selenium 一脉相承&#xff0c;selenium 中的定位方式Appium 中都支持&#xff0c;而 Appium 还增加了自己…...

C#.net6.0+Vue+Ant-Design智慧医院手术麻醉系统源码 手术麻醉软件信息化管理系统 麻醉文书祥解

C#.net6.0VueAnt-Design智慧医院手术麻醉系统源码 手术麻醉软件信息化管理系统 麻醉文书祥解 医护人员通过手麻信息系统可以进行手术的预约申请、受理、安排&#xff0c;从门诊医生下医嘱到发起手术申请、护士长审核通过&#xff0c;均实现了全流程信息化管理&#xff0c;大大…...

6G时代,即将来临!

日前&#xff0c;由未来移动通信论坛、紫金山实验室主办的2024全球6G技术大会在南京召开。本次大会以“创新预见6G未来”为主题&#xff0c;在大会开幕式上发布了协力推进全球6G统一标准行动的倡议和紫金山科技城加速培育以6G技术引领未来产业行动计划。 在我国已开展第五代移动…...

进程、线程的区别

进程、线程的关系 开工厂生产手机&#xff0c;制作一条生产线&#xff0c;这个生产线上有很多的器件以及材料。一条生产线就是一个进程。 只有生产线是不够的&#xff0c;使用找五个工人来进行生产&#xff0c;这个工人能够利用这些材料最终一步步的将手机做出来&#xff0c;这…...

JWT详解、JWTUtil工具类的构建方法

一、前言 使用一些用户不友好的项目时&#xff0c;会发现&#xff0c;每一次进入网站&#xff0c;我们都要重新登录。 这是为什么呢&#xff1f; 现代多采用前后端分离的项目架构&#xff0c;这种架构&#xff0c;前后端使用不同的服务器&#xff0c;两个服务器上存储的信息不…...

江协科技51单片机学习- p11 静态数码管显示

前言&#xff1a; 本文是根据哔哩哔哩网站上“江协科技51单片机”视频的学习笔记&#xff0c;在这里会记录下江协科技51单片机开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技51单片机教学视频和链接中的内容。 引用&#xff1a; 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实现 题目 原题连接&#xff1a;42. 接雨水 1- 思路 模式识别&#xff1a;求雨水的面积 ——> 不仅是只求一个比当前元素大的元素&#xff0c;还要求面积 单调栈 应用场景&#xff0c;需要找到左边比当前元素大的…...

GPT-4o一夜被赶超,Claude 3.5一夜封王|快手可灵大模型推出图生视频功能|“纯血”鸿蒙大战苹果AI|智谱AI“钱途”黯淡|月之暗面被曝进军美国

快手可灵大模型推出图生视频功能“纯血”鸿蒙大战苹果AI&#xff0c;华为成败在此一举大模型低价火拼间&#xff0c;智谱AI“钱途”黯淡手握新“王者”&#xff0c;腾讯又跟渠道干上了“美食荒漠”杭州&#xff0c;走出一个餐饮IPOGPT-4o一夜被赶超&#xff0c;Anthropic推出Cl…...

C# + easyui 写的一个web项目

用C# easyui 来开发&#xff0c;其实就是为了开发速度&#xff0c;用easyui可以一天写很多页面&#xff0c;比一些低代码平台还快。 登陆页面 主界面 记录数统计 家庭信息采集表 新建家庭 家庭成员 低保、五保人员帮扶情况登记表 低保、五保人员帮扶情况登记表的新增和编辑 治…...

JVM 垃圾回收分配及算法

一、判断对象是否可以回收 垃圾收集器在做垃圾回收的时候&#xff0c;首先需要判定的就是哪些内存是需要被回收 的&#xff0c;哪些对象是「存活」的&#xff0c;是不可以被回收的&#xff1b;哪些对象已经「死掉」了&#xff0c;需 要被回收。 一般有两种方法来判断&#xff…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...