设计模式SOLID

2023-11-13

一:单一职责原则

一个类或者一个模块只完成一个功能

class UserInfo
{ userId, username, email, telephone}

二:开闭原则

对扩展开放,对修改关闭

class Alert
{
    void check(errorCount, duration)
    {
        if(errorCount > COUNT)
            notifiction.notify();
        if(duration > DURATION)
            notification.notify();
    }
}

此时如果要增加一个tps峰值检测,就需要在Alert中添加,其次check的调用入参也需要更改,不符合“对修改关闭”的原则

可以这样:把errorCout和duration封装为class handler的子类,Alert中增加一个vector 数组,check()中轮询vector中数据,调用各handler子类的函数

伪代码如下:

class AlertHandler
{//基类
    public:
        AlertHandler(AlertRule r, Notification n) : rule(r), notification(n)
        {
                    
        }
        void check() = 0;
        
    public:
        AlertRule rule;
        Notification notification;
};

Class ErrorCountHandler : public AlertHandler
{
    public:
        void check(ApiStateInfo info)
        {
             if(info.getErrorCount() > rule.errorCount )           
             {
                 notification.notify("errorCount error!")             
             }
        }
};

Class DurationHandler : public AlertHandler
{
    public:
        void check(ApiStateInfo info)
        {
             if(info.getDuration() > rule.duration )           
             {
                 notification.notify("duration error!")             
             }
        }
};
class Alert
{
    public:
        vector<Handler> alterHandlers;
        void addAlertHandler(AlertHandler handler)
        {
            alertHandlers.emplace_back(handler);        
        } 
        void check()
        {
            for(auto handler : alterHandlers)
            {//apiStateInfo为初始阈值
                 handler.check(apiStateInfo);              
            }        
        }   
}

此时再新增一个告警监测只要继承AlertHandler,实现自己的check(),把TpsHandler 添加到Alert的vector即可,没有损坏原有结构,如下

Class TpsHandler : public AlertHandler
{
    public:
        void check(ApiStateInfo info)
        {
             if(info.tpsVal() > rule.tpsVal)           
             {
                 notification.notify("tpsValerror!")             
             }
        }
};

三:里氏替换原则

子类对象能够替换程序中的父类对象出现的任何地方,并且保证程序原有的逻辑不变以及正确性不被破坏

四:接口隔离原则

Clients should not be forced to depend upon interfaces that they do not use.

不应该强迫客户端去依赖它不需要的接口。 客户端是指接口调用者或使用者

例:

微服务用户系统提供了一组用户相关的API,如注册,登录,获取用户信息等,

class UserInfo
{
    void register(string cellphone, string passwd);
    void login(string cellphone, string passwd);
    void getUserInfoById(int userId);
}

此时,后台管理系统要实现删除用户的功能,如果直接在上面UserInfo中添加deleteUserById(),会造成以下两点

  1. 会造成误删(应该在架构层面避免这种情况,而不是把权限放给用户)
  2. 用户并不需要删除用户的接口,违背了接口隔离原则

应该把删除用户的接口单独封装,只提供给需要它的后台管理系统

class UserInfo
{
    void register(string cellphone, string passwd);
    void login(string cellphone, string passwd);
    void getUserInfoById(int userId);
}

class RetrictedUserService
{
    bool deleteUserById(int userId);
};

五:依赖反转原则

High-level modules shouldn’t depend on low-level modules. Both modules should depend on abstractions. In addition, abstractions shouldn’t depend on details. Details depend on abstractions.

我们将它翻译成中文,大概意思就是:高层模块(high-level modules)不要依赖低层模块(low-level)。高层模块和低层模块应该通过抽象(abstractions)来互相依赖。除此之外,抽象(abstractions)不要依赖具体实现细节(details),具体实现细节(details)依赖抽象(abstractions)。

例:

Tomcat 是运行 Java Web 应用程序的容器。我们编写的 Web 应用程序代码只需要部署在 Tomcat 容器下,便可以被 Tomcat 容器调用执行。按照之前的划分原则,Tomcat 就是高层模块,我们编写的 Web 应用程序代码就是低层模块。Tomcat 和应用程序代码之间并没有直接的依赖关系,两者都依赖同一个“抽象”,也就是 Sevlet 规范。Servlet 规范不依赖具体的 Tomcat 容器和应用程序的实现细节,而 Tomcat 容器和应用程序依赖 Servlet 规范。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计模式SOLID 的相关文章

  • 设计模式——原型模式

    原型模式顾名思义 就是指以某个实例为原型 copy出一个新的实例 该实例属性与原型相同或者是类似 很多时候 我们需要创建大量的相同或者相似的对象 如果一个个用new 构造函数的形式去创建的话比较繁琐 就像孙悟空要想变出成千上万个猴子猴孙总不
  • 设计模式之享元模式

    一 背景 在面向对象程序设计过程中 有时会面临要创建大量相同或相似对象实例的问题 创建那么多的对象将会耗费很多的系统资源 它是系统性能提高的一个瓶颈 例如 围棋和五子棋中的黑白棋子 图像中的坐标点或颜色 局域网中的路由器 交换机和集线器 教
  • 计算资源合并模式——云计算架构常用设计模式

    背景 云计算的解决方案中 最初设计可能有意遵循关注点分离的设计原则 把操作分解为独立的计算单元以便可以单独托管和部署 然而 虽然这种策略可以帮助简化解决方案的逻辑实现 但是在同一个应用程序中要部署大量的计算单元 这会增加运行时的托管成本 并
  • Java设计模式-装饰者模式Decorator

    介绍 装饰者模式的核心思想是通过创建一个装饰对象 即装饰者 动态扩展目标对象的功能 并且不会改变目标对象的结构 提供了一种比继承更灵活的替代方案 需要注意的是 装饰对象要与目标对象实现相同的接口 或继承相同的抽象类 另外装饰对象需要持有目标
  • C++设计模式-State状态模式

    State状态模式作用 当一个对象的内在状态改变时允许改变其行为 这个对象看起来像是改变了其类 UML图如下 State类 抽象状态类 定义一个接口以封装与Context的一个特定状态相关的行为 ConcreteState类 具体状态 每一
  • 设计模式——导论

    作为软件开发人员 我们在平时工作的过程中 往往需要编写很多的代码来实现我们的需求 很多的时候会造成代码臃肿和代码冗余的情况 这个时候我们需要引入一个理念 设计模式 设计模式存在的意义在于 1 使得我们的代码更加精炼 2 使我们代码的可读性更
  • Java 多线程模式 —— Guarded Suspension 模式

    Part1Guarded Suspension 模式的介绍 我们只从字面上看 Guarded Suspension 是受保护暂停的意思 1Guarded Suspension 模式 在实际的并发编程中 Guarded Suspension
  • Eureka迁移到Nacos之服务名称大小问题解决

    我们应用往Eureka中注册使用的名称以及应用内部通过Feign调用 使用的服务名称都是小写 如user service 但是注册到Eureka中后 应用的名称全部都是以大写的形式存储及展现 由于Eureka客户端对大小写的支持都是一样的
  • Java并发编程之设计模式

    同步模式之保护性暂停 1 定义 即 Guarded Suspension 用在一个线程等待另一个线程的执行结果 要点 有一个结果需要从一个线程传递到另一个线程 让他们关联同一个 GuardedObject 如果有结果不断从一个线程到另一个线
  • 设计模式-2--工厂模式(Factory Pattern)

    一 什么是工厂模式 工厂模式 Factory Pattern 是一种创建型设计模式 它提供了一种创建对象的接口 但是将对象的实例化过程推迟到子类中 工厂模式允许通过调用一个共同的接口方法来创建不同类型的对象 而无需暴露对象的实例化逻辑 工厂
  • 第12课:生活中的构建模式——想要车还是庄园

    用程序来模拟生活 从剧情中思考构建模式 与工厂模式的区别 与组合模式的区别 构建模式的模型抽象 类图 基于升级版的实现 模型说明 应用场景 故事剧情 下周就要过年了 这是 Tony 工作后的第一个春节 还是在离家这么远的北京工作 所以肯定不
  • 设计模式学习笔记-工厂模式

    设计模式学习笔记 工厂模式 作用 实现了创建者和调用者的分离 详细分类 简单工厂模式 用来生产同一等级结构中的任意产品 对于增加新的产品 必须要扩展已有的代码 工厂方法模式 用来生产同一等级结构中的固定产品 支持增加任意产品 抽象工厂模式
  • kubeadm集群化部署多master节点(生产环境适用)

    一 背景介绍 k8s通过master集中式管理worknode的容器编排系统 而在生产环境为了维护高可用性 master的地位起到举无轻重的作用 一旦master节点失守 则会导致整个集群服务不可用 因此配置多master集群在生产环境非常
  • JavaScript设计模式-02-单例模式

    Javascript 设计模式 02 单例模式 简介 单例就是保证一个类只有一个实例 实现的方法一般是先判断实例是否存在 如果存在直接返回 如果不存在就创建了再返回 确保了一个类只有一个实例对象 在JavaScript里 单例作为一个命名空
  • 二十四种设计模式之策略模式

    一 什么是策略模式 简单来说 策略模式是将每一个算法封装到拥有共同接口的不同类中 使得算法可以在不影响客户端的情况下发生变化 也可以理解为可供程序运行时选择的 不同的类 不同的解决方案 策略模式的特点 高内聚低耦合 可扩展 遵循ocp原则
  • Redis——Redis简介

    Redis是目前最流行的键值对 key value 数据库 以出色的性能著称 官方提供的数据是可以支持100000以上的 QPS Redis具有高性能的主要原因如下 Redis是基于内存的存储数据库 绝大部分的命令处理只是纯粹的内存操作 内
  • Redis——简单动态字符串(Simple Dynamic Strings,SDS)

    简单动态字符串 Simple Dynamic Strings SDS 是Redis的基本数据结构之一 用于存储字符串和整型数据 SDS兼容C语言标准字符串处理函数 且在此基础上保证了二进制安全 1 数据结构 在了解SDS源码前 我们先思考一
  • Redis HyperLogLog:数据统计的轻量级解决方案

    引言 在现代数据驱动的应用中 Redis 以其出色的性能和灵活性成为了不可或缺的工具 特别是在统计大量数据时 传统的计数方法往往既耗时又占用大量存储空间 这次 阿七将介绍一种名为 HyperLogLog 的算法 它在 Redis 中的实现让
  • 【设计模式之美】理论一:怎么才算是单一原则、如何取舍单一原则

    文章目录 一 如何判断类的职责是否足够单一 二 类的职责是否设计得越单一越好 开始学习一些经典的设计原则 其中包括 SOLID KISS YAGNI DRY LOD 等 本文主要学习单一职责原则的相关内容 单一职责原则的定义 一个类只负责完
  • 【设计模式之美】面向对象分析方法论与实现(二):需求到接口实现的方法论

    文章目录 一 进行面向对象设计 1 划分职责 gt 需要有哪些类 2 定义类及其属性和方法 3 定义类与类之间的交互关系 4 将类组装起来并提供执行入口 二 如何进行面向对象编程 1 接口实现

随机推荐

  • LR寄存器

    异常的发生会导致程序正常运行的被打断 并将控制流转移到相应的异常处理 异常响应 有些异常 fiq irq 事件处理后 系统还希望能回到当初异常发生时被打断的源程序断点处继续完成源程序的执行 异常返回 这就需要一种解决方案 用于记录源程序的断
  • android 调用短信,Android 调用发送短信的方法

    Android 调用发送短信的方法 功能 调用发送短信功能 1 权限 2 具体实现 Uri smstoUri Uri parse smsto Intent intent new Intent Intent ACTION VIEW smsto
  • 在C#中使用Halcon开发视觉检测程序

    本文的初衷是希望帮助那些有其它平台视觉算法开发经验的人能快速转入Halcon平台下 通过文中的示例开发者能快速了解一个Halcon项目开发的基本步骤 让开发者能把精力完全集中到算法的开发上面 首先 你需要安装Halcon HALCON 18
  • 图像分类,目标检测,语义分割的FC的区别

    还有半个月就要过年啦 提前给大伙拜个年哈哈 快放假了又进入了划水的阶段啥都不太想干 但是就算是划水也不能中断思考啊 谁让咱是搞技术的呢 过去的几个月里把语义分割 目标检测和图像分类都稍微了解了一下 因为是入门阶段所以聊得东西都比较简单 这篇
  • java 冥计算,次方

    1 乘以某个数的冥 BigDecimal one new BigDecimal Math pow 2 5 2的5次方 BigDecimal two new BigDecimal 10 乘数 BigDecimal multiply one m
  • unity主场景设置、场景切换、全屏设置、背景音乐设置(场景一加载就开始播放)

    主场景设置 最简单的方法 一般情况下我们的场景会有挺多的 这时候我们进入游戏就会有问题了 unity应该先加载哪一个呢 unity给了我们几种方案 其中一种是在文件 生成设置里面更改游戏场景的优先级 其中0是最高优先级 当然 必须得先把场景
  • 2023最新springboot计算机毕业设计选题大全(附源码+论文答辩),别再发愁毕设了。

    2023最新springboot计算机毕业设计选题大全 附源码 论文答辩 别再发愁毕设了 要对当前自己的学校对于计算机毕业设计的要求以及严格程度有所了解 这个主要是借助上一届已经毕业的学长学姐了解一下 但是有一点要注意的是 对于每一届毕业生
  • 希尔排序—C语言实现

    目录 前言 希尔排序 发展历史 基本思想 时间复杂度 我们以一组数字来说操作说明 gap的选取 动图演示 代码 总结 前言 在学数据结构的第一节课就知道了数据结构课程是要管理并且学会操作数据 当然操作数据首先想到的就是数据的排序 排过顺序的
  • PHP正则表达式匹配教程

    一 什么是正则表达式 正则表达式是一种用于搜索 匹配 替换某种文本的字符串模式 常用于处理文本数据 校验输入数据等 在PHP中 可以使用preg系列函数 preg match preg replace等 处理正则表达式 二 正则表达式语法
  • 解决org.apache.hadoop.ipc.RenoteException(java.io.IOException)

    前言 用VMware搭了一个spark 集群环境 练习spark shell 因为懒一直没关虚拟机 一直卡到玩不了了 没关闭spark hadoop集群 直接干掉了 虚拟机 然后 网卡炸了 各种修修补补 master节点死活ping不通 子
  • 连接mysql的url是什么意思_URL是什么意思?

    这个维基百科上有翻译 URL Uniform Resource Locator 统一资源定位符 URI Uniform Resource Identifier 统一资源标志符 URL 是一种比较统一的带参数指向某个地址的格式 格式为 协议类
  • 私有云笔记推荐(obsidian+nas同步)

    文章目录 Joplin Leanote 蚂蚁笔记 obsidian webdav 内网穿透 Trilium vnote 总结 nas同步 Obsidian Joplin https joplinapp org https www jians
  • C++11 原子变量

    目录 什么时原子变量 atomic 类成员 原子变量的使用 C C Linux服务器开发 后台架构师 零声教育 学习视频教程 腾讯课堂 什么时原子变量 原子操作 原子指的是一系列不被 CPU上下文交换的机器指令 这些指令组合在一起就形成了原
  • Sonar安全

    1 Using Struts 1 ActionForm is security sensitive 使用Struts1的ActionForm是安全敏感的 All ActionForm s properties should be valid
  • doccano 解决 pydantic.errors.PydanticImportError: `pydantic:ConstrainedStr` has been removed in V2.

    文章目录 报错信息 环境 描述 解决措施 其他 doccano一直转圈圈 报错信息 File C Users anaconda3 envs UIE lib site packages pydantic migration py line 2
  • 通过axios实现的一个搜索查询展示案例

    代码如下 App js import React Component from react import Search List from components export default class App extends Compon
  • Flink实战之实时风控规则引擎

    问题导读 1 怎样构建一个风控业务架构 2 风控规则模型有哪些 3 怎样实现Flink CEP 动态更新 一 项目背景 目前钱大妈基于云原生大数据组件 DataWorks MaxCompute Flink Hologres 构建了离线和实时
  • java程序员专业技能_java程序员简历专业技能怎么写

    专业技能 案例一 1 了解Javascript编程 jQuery框架以及AJAX等前台技术 并且能够熟练使用 jQuery easy UI等jQuery插件 2 掌握Spring框架 包括IOC和DI AOP编程 声明式事务处理及SSH的整
  • 【Python3】smtp邮件内容格式(三)

    邮件正文内容 文本方式 第三个参数 第一个为文本内容 第二个 plain 设置文本格式 第三个 utf 8 设置编码方式 message MIMEText Python 邮件发送测试 plain utf 8 邮件正文 html方式 第三个参
  • 设计模式SOLID

    一 单一职责原则 一个类或者一个模块只完成一个功能 class UserInfo userId username email telephone 二 开闭原则 对扩展开放 对修改关闭 class Alert void check error