设计模式之七大设计原则《单一职责原则》

Java设计模式核心技术 Java设计模式 001-原型模式&设计模式和原则 002-状态模式&解释器模式&单例模式 003-何时会用到设计模式 004-汽车建造者样例&建造者模式 005-七大设计原则介绍 (软件架构设计原则(提高代码重用性,可读性,可扩展性,可靠性,高内聚和低耦合,七大原则,单一原则,接口隔离,依赖倒置,里氏替换原则,开闭,迪利特,合成复用)&) 0... 阅读详情

1、设计模式的重要性

1) 软件工程中,设计模式(design pattern)是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方

案。这个术语是由埃里希·伽玛(Erich Gamma)等人在 1990 年代从建筑设计领域引入到计算机科学的

2) 大厦 VS 简易房

3) 拿实际工作经历来说, 当一个项目开发完后,如果客户提出增新功能,怎么办?。(可扩展性,使用设计模式,软

件具有很好的扩展性)

4) 如果项目开发完后,原来程序员离职,你接手维护该项目怎么办? (维护性[可读性、规范性])

5) 目前程序员门槛越来越高,一线 IT 公司(大厂),都会问你在实际项目中使用过什么设计模式,怎样使用的,解

决了什么问题。

6) 设计模式在软件中哪里?面向对象(oo)=>功能模块[设计模式+算法(数据结构)]=>框架[使用到多种设计模式]=>

架构 [服务器集群]

7) 如果想成为合格软件工程师,那就花时间来研究下设计模式是非常必要的.

2、设计模式的目的

编写软件过程中,程序员面临着来自 耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性 等多方面的
挑战,设计模式是为了让程序(软件),具有更好
1) 代码重用性 (即:相同功能的代码,不用多次编写)
2) 可读性 (即:编程规范性, 便于其他程序员的阅读和理解)
3) 可扩展性 (即:当需要增加新的功能时,非常的方便,称为可维护)
4) 可靠性 (即:当我们增加新的功能后,对原来的功能没有影响)
5) 使程序呈现高内聚,低耦合的特性
分享金句:
6) 设计模式包含了面向对象的精髓,“懂了设计模式,你就懂了面向对象分析和设计(OOA/D)的精要”
7) Scott Mayers 在其巨著《Effective C++》就曾经说过:C++老手和 C++新手的区别就是前者手背上有很多伤疤

3、设计模式七大原则


设计模式原则,其实就是程序员在编程时,应当遵守的原则,也是各种设计模式的基础(即:设计模式为什么
这样设计的依据)
    设计模式常用的七大原则有:
1) 单一职责原则
2) 接口隔离原则
3) 依赖倒转(倒置)原则
4) 里氏替换原则
5) 开闭原则
6) 迪米特法则
7) 合成复用原则

开始从单一职责原则讲起:

4、单一职责原则

单一职责原则的英文名称是Single Responsibility Principle,简称是SRP。这个设计原则备受争议,只要你想和别人争执、怄气或者是吵架,这个原则是屡试不爽的。如果你是老大,看到一个接口或类是这样或那样设计的,你就问一句:“你设计的类符合SRP原则吗?”保准对方立马“萎缩”掉,而且还一脸崇拜地看着你,心想:“老大确实英明”。这个原则存在争议之处在哪里呢?就是对职责的定义,什么是类的职责,以及怎么划分类的职责。我们先举个例子来说明什么是单一职责原则。

只要做过项目,肯定要接触到用户、机构、角色管理这些模块,基本上使用的都是RBAC模型(Role-Based Access Control,基于角色的访问控制,通过分配和取消角色来完成用户权限的授予和取消,使动作主体(用户)与资源的行为(权限)分离),确实是一个很好的解决办法。我们这里要讲的是用户管理、修改用户的信息、增加机构(一个人属于多个机构)、增加角色等,用户有这么多的信息和行为要维护,我们就把这些写到一个接口中,都是用户管理类嘛,我们先来看它的类图,如图1-1所示。

 

太Easy的类图了,我相信,即使是一个初级的程序员也可以看出这个接口设计得有问题,用户的属性和用户的行为没有分开,这是一个严重的错误!这个接口确实设计得一团糟,应该把用户的信息抽取成一个BO(Bussiness Object,业务对象),把行为抽取成一个Biz(Business Logic,业务逻辑),按照这个思路对类图进行修正,如图1-2所示。


重新拆封成两个接口,IUserBO负责用户的属性,简单地说,IUserBO的职责就是收集和反馈用户的属性信息;IUserBiz负责用户的行为,完成用户信息的维护和变更。各位可能要说了,这个与我实际工作中用到的User类还是有差别的呀!别着急,我们先来看一看分拆成两个接口怎么使用。OK,我们现在是面向接口编程,所以产生了这个UserInfo对象之后,当然可以把它当IUserBO接口使用。也可以当IUserBiz接口使用,这要看你在什么地方使用了。要获得用户信息,就当是IUserBO的实现类;要是希望维护用户的信息,就把它当作IUserBiz的实现类就成了,如代码清单1-1所示。

……
IUserBiz userInfo=new UserInfo();
//我要赋值了,我就认为它是一个纯粹的BO
IUserBO userBO=(IUserBO)userInfo;
userBO.setPassword("abc");
//我要执行动作了,我就认为是一个业务逻辑类
IUserBiz userBiz=(IUserBiz)userInfo;
userBiz.deleteUser();
……

 

基本介绍


对类来说的,即一个类应该只负责一项职责。如类 A 负责两个不同职责:职责 1,职责 2。当职责 1 需求变更
而改变 A 时,可能造成职责 2 执行错误,所以需要将类 A 的粒度分解为 A1,A2

应用实例

1) 方案 1
[分析说明]
package com.atguigu.principle.singleresponsibility;
public class SingleResponsibility1 {
    public static void main(String[] args) {
        Vehicle vehicle = new Vehicle();
        vehicle.run("摩托车");
        vehicle.run("汽车");
        vehicle.run("飞机");
    }
}
// 交通工具类
// 方式 1
// 1. 在方式 1 的 run 方法中,违反了单一职责原则
// 2. 解决的方案非常的简单,根据交通工具运行方法不同,分解成不同类即可
class Vehicle {
    public void run(String vehicle) {
        System.out.println(vehicle + " 在公路上运行....");
    }
}

2) 方案 2

[分析说明]
package com.atguigu.principle.singleresponsibility;
public class SingleResponsibility2 {
    public static void main(String[] args) {
        RoadVehicle roadVehicle = new RoadVehicle();
        roadVehicle.run("摩托车");
        roadVehicle.run("汽车");
        AirVehicle airVehicle = new AirVehicle();
        airVehicle.run("飞机");
    }
}
//方案 2 的分析
//1. 遵守单一职责原则
//2. 但是这样做的改动很大,即将类分解,同时修改客户端
//3. 改进:直接修改 Vehicle 类,改动的代码会比较少=>方案 3
class RoadVehicle {
    public void run(String vehicle) {
        System.out.println(vehicle + "公路运行");
    }
}
class AirVehicle {
    public void run(String vehicle) {
        System.out.println(vehicle + "天空运行");
    }
}
class WaterVehicle {
    public void run(String vehicle) {
        System.out.println(vehicle + "水中运行");
    }
}

3) 方案 3
[分析说明]
package com.atguigu.principle.singleresponsibility;
public class SingleResponsibility3 {
    public static void main(String[] args) {
        Vehicle2 vehicle2 = new Vehicle2();
        vehicle2.run("汽车");
        vehicle2.runWater("轮船");
        vehicle2.runAir("飞机");
    }
}
//方式 3 的分析
//1. 这种修改方法没有对原来的类做大的修改,只是增加方法
//2. 这里虽然没有在类这个级别上遵守单一职责原则,但是在方法级别上,仍然是遵守单一职责
class Vehicle2 {
    public void run(String vehicle) {
        //处理
        System.out.println(vehicle + " 在公路上运行....");
    }
    public void runAir(String vehicle) {
        System.out.println(vehicle + " 在天空上运行....");
    }
    public void runWater(String vehicle) {
        System.out.println(vehicle + " 在水中行....");
    }
}


单一职责原则注意事项和细节
1) 降低类的复杂度,一个类只负责一项职责。
2) 提高类的可读性,可维护性
3) 降低变更引起的风险
4) 通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单一职责原则;只有类中
方法数量足够少,可以在方法级别保持单一职责原则【一个方法承担一个职责】

5)通常情况下,如果一个类中的方法特别多的时候,而且每个功能和具体类别有关的话,那么我们需要设计成多个类,不能方法智能单一原则了,需要类单一职责原则

6)变更引起的风险降低,变更是必不可少的,如果接口的单一职责做得好,一个接口修改只对相应的实现类有影响,对其他的接口无影响,这对系统的扩展性、维护性都有非常大的帮助。看过电话这个例子后,是不是想反思一下了,我以前的设计是不是有点问题了?不,不是的,不要怀疑自己的技术能力,单一职责原则最难划分的就是职责。一个职责一个接口,但问题是“职责”没有一个量化的标准,一个类到底要负责那些职责?这些职责该怎么细化?细化后是否都要有一个接口或类?这些都需要从实际的项目去考虑,从功能上来说,定义一个IPhone接口也没有错,实现了电话的功能,而且设计还很简单,仅仅一个接口一个实现类,实际的项目我想大家都会这么设计。项目要考虑可变因素和不可变因素,以及相关的收益成本比率,因此设计一个IPhone接口也可能是没有错的。但是,如果纯从“学究”理论上分析就有问题了,有两个可以变化的原因放到了一个接口中,这就为以后的变化带来了风险。如果以后模拟电话升级到数字电话,我们提供的接口IPhone是不是要修改了?接口修改对其他的Invoker类是不是有很大影响?
注意 单一职责原则提出了一个编写程序的标准,用“职责”或“变化原因”来衡量接口或类设计得是否优良,但是“职责”和“变化原因”都是不可度量的,因项目而异,因环境而异。
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ESP32-S3驱动PCA9685模块:I2C扩展16路舵机控制实战指南 本文提供了ESP32-S3通过I2C总线驱动PCA9685模块扩展16路PWM输出的完整实战指南。详细解析了PCA9685模块原理、硬件连接、I2C地址配置,并给出了核心驱动代码与角度控制函数,帮助开发者解决微控制器PWM引脚不足的问题,轻松实现多路舵机控制。 阅读详情

相关推荐

ONFI5.0命令字实战指南:从基础操作到高级应用

本文深入解析ONFI5.0协议的核心——命令字,提供从基础操作到高级应用的实战指南。详细拆解了NAND闪存的复位、读状态、数据读取(00-30)、页编程(80-10)和块擦除(60-D0)等关键命令周期,并探讨了多平面操作与缓存操作等高级性能优化技巧,帮助开发者高效、稳定地与NAND芯片进行底层交互。

vscode5coder的博客 463

设计模式原则——单一职责原则

单一职责原则了解

Whoo_的博客 681

Windows Server 搭建ftp服务

Windows Server 搭建ftp服务

ch258563的博客 1010

设计模式六大原则

文章目录软件设计的六大原则1. 开放-封闭原则2. 单一职责原则举例3. 里氏替换原则4. 依赖倒置原则举例5. 接口隔离原则6. 迪米特原则举例 软件设计的六大原则 设计模式的六大原则 参考URL: https://zhuanlan.zhihu.com/p/92152190 1. 开放-封闭原则 Open-Close Principle(OCP):一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。目的就是保证程序的扩展性好,易于维护和升级。 对于扩展是开放的,对于更改是封闭的。 开放-封闭原则是面向

西京刀客 1万+

MATPOWER的安装详细教程

MATPOWER的安装包实际为一个程序包,安装教程很简单,详见本文。

半个月亮Zz的博客 3万+

Basilisk vs. STK:开源航天仿真工具在Windows上的实战体验与生态对比

本文对比了开源航天仿真工具Basilisk与商业软件STK在Windows平台上的实战体验与生态差异。从技术架构、安装配置、使用成本、功能覆盖、社区生态到适用场景,全面分析了二者的优劣势,为航天工程师和研究人员提供选型参考。Basilisk在性能和扩展性上表现突出,而STK在可视化与专业模块上更具优势。

weixin_30632089的博客 588

设计模式与六大原则

设计模式6大原则

kayyoo的博客 2137

统信UOS/麒麟ARM桌面版,不联网也能用Docker部署MySQL 5.7(离线部署详解)

本文详细介绍了在统信UOS/银河麒麟ARM桌面版系统中,如何离线部署MySQL 5.7的完整流程。通过Docker技术实现环境隔离和依赖封装,解决了封闭网络环境下的部署难题,包括资源准备、系统配置、容器化部署及安全加固等关键步骤,为政企和科研场景提供实用解决方案。

weixin_30892037的博客 229

设计模式七大原则

对类来说的,即一个类应该只负责一项职责。如类 负责两个不同职责:职责1,职责2。当 职责1 需求变更而改变 时,可能造成 职责2 执行错误,所以需要将类 的粒度分解为 A1,A2。 示例二 该示例遵守了单一职责原则, 但是这样做的改动很大,即将类分解,同时修改客户端, 是类级别上的单一职责。 示例三(推荐) 该示例虽然没有在类这个级别上遵守单一职责原则, 但是在方法级别上,仍然是遵守单一职责 注意事项和细节 降低类的复杂度,一个类只负责一项职责 提高类的可读性,可维护性 降低变更引起的风

沉梦听雨的博客 1527

布尔可满足性问题(SAT)深度研究

布尔可满足性问题(Boolean Satisfiability Problem, SAT)是计算机科学和数理逻辑中的一个核心决策问题。其定义为:对于一个给定的布尔逻辑公式,判断是否存在一组对其变量的真值赋值(即,为每个变量指定真 (True) 或假 (False)),使得该公式的最终计算结果为真。如果存在这样的赋值,则称该布尔公式是可满足的 (satisfiable);否则,称其为不可满足的 (unsatisfiable)。

步子哥的博客 495

LeRobot 入门教程(十一)π0(Pi0)π0.5(Pi0.5)训练、推理、部署

本文介绍了Physical Intelligence公司开发的π₀和π₀.₅系列通用机器人控制视觉-语言-动作模型。π₀作为首款基础模型,融合流匹配、跨实体训练等技术,支持50Hz高频控制。π₀.₅是其升级版,通过异构数据协同训练解决开放世界泛化问题,在Libero基准测试中表现优异。文章详细说明了两个模型的安装要求、使用方法、训练策略及关键参数配置,包括混合精度训练、梯度检查点等优化技术,为机器人在多样化场景中的语义理解和动作控制提供了完整解决方案。

2506_90492529的博客 5038

设计模式七大设计原则之单一职责原则

设计模式七大设计原则之单一职责原则 1.单一职责原则介绍 对类来说,一个类应该只负责一项职责。假如类中有两个职责A和B,如果当其中一个职责的需求发生改变时会导致另一个职责出错,则应该将这个类分解成两个类分别负责职责A和职责B。 2.案例分析 场景:动物都有一个run方法,但是每种动物的运动方式不一样,比如动物分为陆地上跑的,天上飞的,水里游的。如果只有一个动物类就会造成一些问题。下面看看传统的解决...

president_的博客 271

3、灵巧手的设计与构造

本文详细探讨了灵巧手的设计与构造,包括多指结构、关节和连杆设计、传感器集成以及分层控制架构等内容。同时,通过工业装配、医疗手术辅助和日常生活辅助等实际应用案例,展示了灵巧手的灵活性和适应性,并分析了当前设计面临的挑战及未来发展方向。

brandy的博客 490

设计模式——七大设计原则之单一职责原则

单一职责原则的定义 单一职责原则(Single Responsibility Principle,SRP)又称单一功能原则,由罗伯特·C.马丁(Robert C. Martin)于《敏捷软件开发:原则、模式和实践》一书中提出的。这里的职责是指类变化的原因,单一职责原则规定一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分(There should never be more than on...

qq_37776015的博客 202

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

设计模式的七大设计原则:其一:单一职责原则

单一职责原则: 单一职责原则注意事项和细节: 1.降低类的复杂度,一个类只负责一项职责 2.提高类的可读性,可维护性 3.降低变更引起的风险 4.通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单一职责原则;只有类方法数量足够少,可以在方法级别保持单一职责原则。 案例: 1.在方式1的run 方法中,违反了单一职责原则,案例中飞机不能在公路上跑,而是在天空中...

Buggggggg 297

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

设计模式 (一)

设计模式是诸多的前辈们在不断的实践过程中总结出来的设计方法,不同的设计模式针对不同的方法。现在公认的设计模式有23种,对应着23种不同的场景,每一种设计模式只能用于特定的场景,23种设计模式实际上对应着七大设计原则,即每个设计模式都对应着一个或者多个设计原则。 实际上就是将复杂的功能模块不断拆分的规则与方法。 七大原则: 1.单一职责原则 2.里式替换 3.依赖倒置 4.开闭...

qq_38895905的博客 167

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

设计模式之七大设计原则——单一职责原则

单一职责原则 内容:一个类应该只负责一项职责。 如果一个类负责两个不同的职责,当一个职责发生变化的时候,可能会造成另一个职责执行错误 所以如果一个类A有两个职责,那么应该将这个类拆分成两个类A1,A2 举例 public class SingleResponding{ public static void main(String[] args){ Vehicle vehicle = new ...

weixin_43479599的博客 171

【设计模式】七大设计原则--------单一职责原则

单一职责原则的实际上是一个类应该只负责一项职责,以此控制类的粒度大小、将对象解耦、提高其内聚性。

北极星的博客 465

Java设计模式笔记——七大设计原则

面向对象设计原则为支持可维护性复用而诞生,这些原则蕴含在很多设计模式中,它们是从许多设计方案中总结出的指导性原则。面向对象设计原则也是我们用于评价一个设计模式的使用效果的重要指标之一,本文就记录了常见7种面向对象设计原则学习笔记。设计模式是一套经过反复使用的代码设计经验,目的是为了重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式于己于人于系统都是多赢的,它使得代码编写真正工程化,它是软件工程的基石,如同大厦的一块块砖石一样。

想混口饭&的博客 528

DesignPattern_Java:设计模式分类和设计原则

设计模式分类: 创建型: 单例模式(Singleton Pattern) 工厂方法模式(Factory Pattern) 抽象工厂模式(Abstract Factory) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern) 结构型: 代理模式(Proxy) 装饰模式(Decorator) 适配器模式(Adapter) 组合模式(Com

Anonymous 1810

软件开发七大原则

本文介绍了软件设计模式和七大设计原则。设计模式分为创建型、结构型和行为型三类,共23种模式,是面向对象设计原则的具体应用。七大设计原则包括:单一职责原则(一个类只做一件事)、开闭原则(对扩展开放修改关闭)、里氏替换原则(子类不改变父类功能)、依赖倒置原则(面向接口编程)、接口隔离原则(接口要小而专)、迪米特法则(降低耦合度)和合成复用原则(优先使用组合而非继承)。这些原则共同指导软件开发,提高代码的可维护性、扩展性和复用性。

2301_76585964的博客 624

设计模式学习笔记——七大原则

设计模式 设计模式的目的 编写软件过程中,程序员面临着来自耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性等多方面的挑战,设计模式是为了让程序具有更好的 代码重用性(即:相同功能的代码,不用多次编写) 可读性(即:编程规范性,便于其他程序员的阅读和理解) 可扩展性(当需要增加新功能时,非常的方便,称为可维护) 可靠性(当我们增加新的功能后,对原来的功能没有影响) 使程序呈现高内聚,低耦合的特性 设计模式的七大原则 单一职责原则 即一个类只负责一项职责。如类A负责两个不同的职责:职责1、职责2,当职

俊伟的博客 174

设计模式概念和七大原则

设计模式概念和七大原则 转载 设计模式概念和七大原则 什么是设计模式 在GoF(Gang of Four)的书籍《Design Patterns - Elements of Reusable Object-Oriented Software(设计模式-可复用面向对象软件的基础)》中是这样定义设计模式的:Christopher Alexander说过:“每一个模式描述了一个在我们周围不断重复发生的问题以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动” [AIS+77,第10页

sinat_37316828的博客 316

面向对象设计原则

学了设计模式有一段时间了,忘记的差不多了。特写几篇博客,作为知识点回顾。不会有特别详细的内容,我目前也没那个能力。 想要系统学习设计模式,推荐刘伟老师的博客:http://blog.youkuaiyun.com/lovelion/article/details/17517213,代码是用java写的,但道理是一样的。我也是从他的课程学起的。教材的话也是他主编的一本,《设计模式 刘伟主编 清华大学出版社》。

悦兮Yui的博客 316

设计模式七大原则详解

设计模式概要 在编写程序中,程序员经常面临着程序的耦合性,内聚性,可维护性,可扩展性,重用性和灵活性等多方面问题。要如何解决改善这些问题,提高编码效率呢?于是就有设计模式的诞生,设计模式并不是新的技术,而是前人对编程手法的总结得出的最优方案。 设计模式七大原则 设计原则就是程序在编程的时候应该遵循的原则,也是各种设计模式的依赖基础。 1、单一职责原则 单一职责就是一个类只负责一项职责。各类之间各司其职。这样降低了类的复杂度,提高了类的可读性和可维护性。降低了因为变更业务引起了连锁问题。 2、接口隔离原则 客

weixin_45003863的博客 438
上一篇: 《java基础学习总结》业余班5范文
下一篇: 设计模式之七大设计原则《接口隔离原则》
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值