设计原则-单一职责原则与接口分离原则

永磁同步电机高效标定技术:从理论到实践的全面解析 本文全面解析永磁同步电机高效标定技术,从MTPA标定、弱磁区优化到初始角校准,详细介绍了理论原理和实战技巧。针对新能源汽车应用场景,提供标定系统集成要点和AI辅助优化方案,帮助工程师提升电机性能标定效率与精度。 阅读详情
单一职责原则 (Simple Responsibility Pinciple,SRP)

这个原则其实很有意思,他规定每个类所拥有的能力必须明确划分,吃饭就吃饭,洗澡就洗澡,睡觉就睡觉,这保证了每个类的相互的能力不会互相污染,你不能一个吃饭的类居然可以点出来洗澡的方法,这听起来就很荒谬。

如果你在学习的时候乐于查看源码,不难会有这样疑问:为什么我们看起来明明可以一步完成的操作他要写那么多封装类还有那么深的层次结构来完成,这很难理解。这也是源码学习晦涩难懂的一部分的原因。

但是,我还是那句话,如果站在更高层次来思考这个问题,不难发现设计者的良苦用心,职责分的细彼此之间相互耦合的可能性就小,功能也就方便维护,不过这个细请适可而止,也并不是说吃饭功能你需要细节到吃哪一粒米,这没有必要,不必要的借口太多反而不好维护。你只要在怎么吃这个功能上细分就好。

今天呢,我还是去吃饭,不过饭店推出了简约套餐和豪华套餐 。

简约套餐:做得很快,但是菜品很简单,很适合早餐,让我们在短时间内就可以完成吃饭动作。

豪华套餐:做得比简约套餐慢许多,但是菜品很丰富,很适合聚餐,晚餐这种有较多时间等待和享用的类型。

老样子,最简单的初版。对套餐(Set)进行编写。

public class Set{
    public void eat(String type){
        if("简约套餐".equals(type)){
            // print 选择简约套餐
        }else{
            // print 选择豪华套餐
        }
    }
}
public static void main(String[] ars){
    Set set = new Set();
    set.eat("简约套餐");
    set.eat("豪华套餐");
}

当然,写成这样还是老问题,就是开闭原则之类的问题。

不过有一点我想要说明的是,设计原则最多也还是参考作用,我们应该尽量遵守,因为真正的业务可能会让我们不得不打破一些看起来很美好的原则,所以比起强制套用设计原则,不如学会善用他们来解决让你挠头的业务问题。

回归正传,这个时候,饭店认为推出的简约套餐和豪华套餐 销量不错,但是顾客觉得花样太单一了,于是为了回应顾客新的业务需求,我们就需要修改一下当初的设计,乘着还没有酿成大祸之前。

public class SimpleSet{
    public void eat(String type){
        System.out.println(type+": 简单快捷.");
    }
}
public class DiffSet{
    public void eat(String type){
        System.out.println(type+": 奢华大气.");
    }
}

我们将两种套餐分成了两个类,为了把他们的职责细分,不再像是以前全部的职责都放在了Food类中,避免了污染。

public static void main(String[] ars){
    DiffSet dset = new Diffset();
    dset.eat("奢华套餐");
    SimpleSet sset = new SimpleSet();
    sset.eat("简约套餐");
}

但这样感觉还是不够好,因为之前依赖倒置中讲过:高层模块与底层模块应该依赖抽象这一概念,所以我们使用接口来再次设计一下。

public interface ISet{
   	void eat(String type);
}
public SimpleSetImpl implements ISet{
    //和之前一样
}
public DiffSetImpl implements ISet{
    //和之前一样
}
public static void main(String[] ars){
    ISet dset = new DiffsetImpl();
    dset.eat("奢华套餐");
    ISet sset = new SimpleSetImpl();
    sset.eat("简约套餐");
}

再回到我们新的需求的问题,我们可以有三种选择。

第一种,我们可以继承简约套餐,而重写里面eat方法。

public SimpleSetImplA extends SimpleSetImpl{
    @Override
    public void eat(String type){
    	System.out.println(type+": A套餐");//简约的A套餐
    }
}
public SimpleSetImplB extends SimpleSetImpl{
    @Override
    public void eat(String type){
    	System.out.println(type+": B套餐");//简约的B套餐
    }
}

第二种,我们所使用的SimpleSetImpl不应该使用类,而应该使用抽象类,让所继承他的子类自由实现自己的套餐内容。也是我比较推荐的一种。

public abstract class DefaultSimpleSet implements ISet{
    //------------
    //*********** 以上是关于套餐的默认方法,表示一些固定的价钱和适用人群到底初始化
    public abstract void eat(String type);
    //让简单套餐的子类去具体实现吃的方法,继承的子类将会自动成为简约套餐的子项。
}
public SimpleSetImplA extends DefaultSimpleSet{
    @Override
    public void eat(String type){
    	System.out.println(type+": A套餐");//简约的A套餐
    }
}
public SimpleSetImplB extends DefaultSimpleSet{
    @Override
    public void eat(String type){
    	System.out.println(type+": B套餐");//简约的B套餐
    }
}

第三种,设计两个接口,一个是ISimpleSet,一个是IDiffSet接口,实现方法我直接贴出来。

public interface ISimpleSet{
    void eat(String type);
}
public interface IDiffSet{
    void eat(String type);
}

//这里只实现简约套餐
public class SimpleSetImpA implements ISimpleSet{
    //具体实现 A 套餐的 eat
}
public class SimpleSetImpB implements ISimpleSet{
    //具体实现 B 套餐的 eat
}

当然我想到了第四种。正好可以提前预热以下接口隔离原则。

public interface ISimpleSet implements ISet{
    // eat 方法
    void simpleSetMethod();//简约套餐独有的方法
}
public interface IDiffSet implements ISet{
    // eat 方法
    void DiffSetMethod();//奢华套餐独有的方法
}

后面就和第三种方法一样。

总结一下单一职责,其实就是对功能的细分,并且要对类将来的会发展成什么样子做出比较良好的架构,对面接口,这将会对你的拓展有很大帮助。


接口隔离原则 (Interface Segregation Principle, ISP)

是指用多个专门的接口,而不使
用单一的总接口,客户端不应该依赖它不需要的接口。这个原则指导我们在设计接口时
应当注意一下几点:
1、一个类对一类的依赖应该建立在最小的接口之上。
2、建立单一接口,不要建立庞大臃肿的接口。
3、尽量细化接口,接口中的方法尽量少(不是越少越好,一定要适度)。

代码我是我从别的地方粘贴过来的,这个大概的内容我其实在上面的四种方法一样,类应该只要依赖一个或者更少的接口。
并且每个都应该有明确的功能,用来区别接口的作用。

这里我就不再赘述了。

C51:PWM+舵机角度控制 PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如方波的占空比就是50%.脉冲宽度调制通过占空比编码模拟信号一个周期内,高电平占据时长的百分比如下图所示,最便宜的舵机sg90,常用三根或者四根接线,黄色为PWM信号控制。 阅读详情

相关推荐

实战解析:利用Python requests库高效抓取京东商品评论并构建结构化数据集

本文详细介绍了如何利用Python requests库高效抓取京东商品评论并构建结构化数据集。通过分析京东评论接口、处理反爬机制以及数据解析存储,帮助开发者快速获取电商数据,适用于竞品监控、用户画像构建等商业场景。

weixin_42526415的博客 837

6大设计原则之单一职责原则

单一职责原则(Single Responsibility Principle, SRP) 当你跟同事争论的时候冒出一句,你这个设计不符合SRP原则时,那是多么的装比,说不定被你的气势直接压住了,哈哈,开个玩笑,实力才是说话权。 单一职责的定义:应该有且仅有一个原因引起类的变更。原话是: There should never be more than one reason f...

学习学习再学习 311

YOLOv5 改进点总览:轻量化、高精度的背后有哪些魔改?

YOLOv5是由Ultralytics团队开发的高效目标检测模型,其核心改进包括:主干网络采用CSPDarknet53提升梯度传播效率;特征融合使用PANet增强小目标识别;输出结构采用解耦头设计优化定位和分类任务。此外,YOLOv5通过CIoU损失函数、Mosaic数据增强和SimOTA标签分配机制进一步提升性能。模型支持多种推理格式(ONNX/TensorRT等),并具备自动锚框匹配和多尺度训练功能,使其在轻量化(yolov5s仅7MB)与高性能(最高51.2% mAP)间取得平衡,但缺乏正式论文支撑是

guoguozgw的博客 1805

接口分离原则(Interface Segregation Principle)

接口分离原则(Interface Segregation Principle)用于处理胖接口(fat interface)所带来的问题。如果类的接口定义暴露了过多的行为,则说明这个类的接口定义内聚程度不够好。换句话说,类的接口可以被分解为多组功能函数的组合,每一组都服务于不同的客户类,而不同的客户类可以选择使用不同的功能分组。 ISP 原则承认了对象设计中非内聚接口的存在。但它建议客户...

aijianxie8808的博客 852

AHB总线协议

1. 简介         AHB总线规范是AMBA总线规范的一部分,AMBA总线规范是ARM公司提出的总线规范,被大多数SoC设计采用,它规定了AHB (Advanced High-performance Bus)、ASB (Advanced System Bus)、APB (Advanced Peripheral Bus)。AHB用于高性能、高时钟频率的系统结构,典型的应用如ARM核与系统内

ivy_reny的专栏 8万+

embedding计算过程

文章目录embedding计算过程(错了跟我讲,我会改)参考示例个人理解过程图示总结(基于pytorch) embedding计算过程(错了跟我讲,我会改) 参考示例 https://www.jianshu.com/p/63e7acc5e890 个人理解过程图示 总结(基于pytorch) 总的来说,就是将独热向量的长度(对应嵌入层的num_embeddings)转变为嵌入层的emdedding_size(而独热向量的维数就是你的数据中一共产生了多少个不一样的词,至少是这么多)。 数据的变化,将二维

纸上得来终觉浅,绝知此事要躬行! 1631

设计原则---接口分离原则

定义如下: 接口隔离原则(Interface Segregation Principle, ISP):使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口. 问题由来:类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类B来说不是最小接口,则类B和类D必须去实现他们不需要的方法。 解决方案:将臃肿的接口I拆分为独立的几个接口,类A和类C分别...

司天宏的博客 1167

从零构建边缘AI数据管道:K230+ESP8266的物联网实践指南

本文详细介绍了如何利用K230开发板和ESP8266模块构建高可靠性的边缘AI数据管道,特别针对智能农业监测场景。通过完整的系统架构设计、AI模型部署、低功耗通信优化和云端集成方案,为开发者提供了一套可落地的物联网实践指南,重点解决了边缘计算环境下的数据传输稳定性和能效管理问题。

j2k3l4的博客 872

类文件的单一接口原则

      面向对象有一个重要的原则:单一职责原则。即一个类应该尽量只承担一种职责。      前几天做了个小程序,把多个类定义在了一个文件中。类和类之间有依赖的关系,还共用几个变量。同时,三个类都有被外界调用的可能。昨晚想来想去觉得不妥。最终得一结论:类文件应该符合单一接口(类)。      对此做如下说明:      一.所谓单一接口是指类的文件对外只有一个发言人。即只有一个类是被

夜色浮尘的专栏 1329

本地部署静态网站托管平台 Netlify 并实现外部访问(Windows 版本)

Netlify 是一款基于云计算的网站部署和托管平台,专为开发者提供便捷的静态网站和 Jamstack 应用部署服务。它的能力在于将网站构建、部署、托管以及持续集成等流程高度集成,简化了开发和运维的复杂程度。用户无需关心服务器的配置、维护等工作。本文将详细介绍如何在本地安装 Netlify 以及结合路由侠内网穿透实现外网访问 Netlify。

lyxnwct的博客 523

告别 Python!C# 直接跑 YOLO 目标检测:工控机边缘推理终极方案

set;set;set;set;set;stringget;set;get;set;get;set;get;set;get;set;告别 Python 依赖,不是排斥 Python 的训练能力,而是为了工程化的极致。在工控机这个资源受限、稳定性要求极高的战场上,是目前最优雅、最高效的解决方案。更少的依赖= 更少的故障点。更快的速度= 更高的产线节拍。更简单的部署= 更低的人力成本。现在,拿起你的 C# 项目,导入那个.onnx。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 420

面向对象的设计原则--接口分离原则

接口分离原则指出,多个特定客户端接口要好于一个宽泛用途的接口。即,一个类对外的接口应该是最小的接口集,任何客户都不应该被强迫依赖于它们不使用的方法。接口应该根据客户的需求来设计,而不是根据它所在的类层次结构来设计。

linkedin_21843693的博客 639

两万字硬核指南!Python爬虫requests库从入门到精通:新手也能搞定所有爬取场景(附实战案例+避坑大全)

请求头是客户端发送给服务器的额外信息,比如User-Agent(浏览器类型)、Referer(来源页面)、Cookie(登录凭证)、(编码方式)等。Cookie是服务器存储在客户端的小型文本文件,包含用户的登录凭证、偏好设置等信息。浏览器会在每次请求时自动携带Cookie,服务器通过Cookie识别用户身份。代理IP是一个中间服务器,你的请求先发送到代理IP,再由代理IP发送到目标网站,目标网站只能看到代理IP的地址,看不到你的真实IP。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1496

面向对象设计原则SOLID原则在Java中的实践指南

在Java中,应该创建特定于客户的细粒度接口,而不是庞大臃肿的通用接口。例如,而不是创建一个包含所有方法的通用设备接口,应该为打印机、扫描仪等分别创建特定接口。例如,定义形状接口,然后让圆形、矩形等具体类实现该接口,这样添加新形状类型时无需修改现有代码。在Java中,这意味着子类不应该加强前置条件或削弱后置条件,也不应该改变基类的预期行为。SOLID原则是面向对象设计中五个基本原则的缩写,由Robert C. Martin提出,旨在帮助开发者构建更易于维护、扩展和理解的软件系统。

qq_32511727的博客 276

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SOLID 代码设计原则

不同于设计模式,在面向对象软件设计当中,还有 SOLID 代码设计原则,本文将对其进行介绍和举例。 1、什么是设计模式 设计模式是软件设计当中通用的、可复用的解决方案,它是关于如何在不同情况下如何解决问题的描述或模版,通常是最佳实践。 设计模式使得代码变得可维护的、可扩展的、解耦的,开发者为每个解决某种类型问题的方案起名,整理成各种通用的设计模式。 注意,软件架构和设计模式是不同的概念,软件架构描述的是要实现什么样的功能和在什么地方来实施,而设计模式是描述怎样来实现。 设计模式不是要编写解决方

fcsfcsfcs的博客 667

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

SOLD原则

借鉴: 1. 单一职责原则 单一职责原则(Single Responsibility Principle,SRP)指出,每个方法或类应当有且仅有 一个改变的理由。这意味着每个方法或类应当做一件事情,或者只有一项职责。在所有的 SOLID原则中,这是大多数开发人员感到最能完全理解的一条。严格来说,这也可能是违 反最频繁的一条原则了。 2. 开放/ 封闭原则 开...

725

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

计算机编程中响应式系统的设计原则与实现挑战

所谓“响应式系统”,是指一类能够实时响应外部事件并作出相应处理的应用程序或服务。它通常采用异步通信方式来解耦各个组件之间的依赖关系,并通过观察者模式(Observer Pattern)或其他机制来追踪状态变化。这种方式不仅简化了代码表达形式,也提高了程序的可读性和复用性。

jie_kou的博客 927

23种最常用的设计模式在很大程度上依赖于7种设计原则

原则一:(SRP:Singleresponsibilityprinciple)单一职责原则又称单一功能原则 核心:解耦和增强内聚性(高内聚,低耦合) 描述: 类被修改的几率很大,因此应该专注于单一的功能。如果你把多个功能放在同一个类中,功能之间就形成了关联, 改变其中一个功能,有可能中止另一个功能,这时就需要新一轮的测试来避免可能出现的问题。 原则二:开闭原则(OCP...

dasanke1762的博客 195

六大设计原则——单一职责原则【Single Responsibility Principle】

声明:本文内容是从网络书籍整理而来,并非原创。 用户管理的例子 先看一张用户管理的类图: 再看一眼上面的图,思考:这样合理吗? 这个接口是一个很糟糕的设计! 用户的属性和行为竟然混合在一起!!! 正确的做法是把用户的信息抽取成一个业务对象(Bussiness Object,简称 BO),把行为抽取成另外一个接口中,我们把这个类图重新画一下: ...

weixin_30469895的博客 90

面向对象的三个基本特征和五种设计原则

参考链接https://blog.youkuaiyun.com/cancan8538/article/details/8057095https://www.jianshu.com/p/7a5b0043b035 三大基本特征 封装 隐藏对象的属性和实现细节,仅对外提供公共访问方式,将变化隔离,便于使用,提高复用性和安全性。 继承 提高代码复用性;继承是多态的前提。 多态 父类或接口定义的引用变量可以指向子类...

weixin_41646851的博客 204

六大设计原则

一个类应当只负责一项职责。

ly1h1的博客 336

面向对象的设计-2.设计原则

设计原则是一种设计指导思想,而不是严格遵循的规则!!!

weixin_62272165的博客 1493

七大设计原则

1.单一职责原则  单一职责原则(SRP:Singleresponsibilityprinciple)又称单一功能原则  核心:解耦和增强内聚性(高内聚,低耦合)。  描述:    类被修改的几率很大,因此应该专注于单一的功能。如果你把多个功能放在同一个类中,    功能之间就形成了关联,改变其中一个功能,有可能中止另一个功能,这时就需要新一轮的测试来避免可能出现的问题。2.里氏替换原则  ...

weixin_30419799的博客 69

面向对象的七种设计原则

1.SRP:Singleresponsibilityprinciple)单一职责原则又称单一功能原则   核心:解耦和增强内聚性(高内聚,低耦合)    描述:     类被修改的几率很大,因此应该专注于单一的功能。如果你把多个功能放在同一个类中,功能之间就形成了关联,改变其中一个功能,有可能中止另一个功能,这时就需要新一轮的测试来避免可能出现的问题。            ...

weixin_30300523的博客 68

Java之OO的特性与原则

OO(Object-Oriented)面向对象 面向对象,有三个特性、五个原则之说。 特性 封装 顾名思义,封装就好比一个黑盒子,内部被隐藏,只有几个接口与外界相连。具体来说,所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。封装是面向对象的特征之一,是对象和类概念的主要特性。 简单的说,一个类就是一个...

weixin_30617737的博客 162

七个设计原则

七个设计原则 整体的设计原则总要达到的目的应该是可复用但耦合度低,易于修改,易于阅读。 开闭原则 一个软件实体应当对扩展开发,对修改关闭。 理解:当你设计的程序不得不面对修改时,我们应该设计其是开放的。可以理解为就是将不得不变化的那部分设计为一种可以用新增替代修改的方案。比如:修改一个商品的折扣时,不是修改原来的折扣比例,而是新增一个折扣模块来替代。 里式替换原则 如果每一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有的对象o1都代换称o2时,程序P的行为没有

m0_38030630的博客 171
上一篇: 使用 IntelliJ IDEA 将 web 工程打包成 war
下一篇: 设计原则-迪米特原则与合成复用原则
PopCandier
博客等级 码龄9年 19粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值