首页 > 其他分享 >设计模式之禅01单一职责原则

设计模式之禅01单一职责原则

时间:2022-10-29 23:45:33浏览次数:74  
标签:01 职责 之禅 接口 设计 设计模式 单一

单一职责原则

1.1 我是“牛”类,我可以担任多职吗

单一职责原则,英文名称是Single Responsibility Principle,简称是SRP,定义是应该有且仅有一个原因引起类的变更。

什么是类的职责,以及怎么划分类的职责?

举例:rbac模型

image-20221029224918986.png

这个接口设计的存在问题:用户属性和用户行为没有分开

image-20221029224945983.png

把用户信息抽取成一个BO(Business Object,业务对象),把行为抽取成一个Biz(Business Logic,业务逻辑),我们面向接口编程,所以产生的UserInfo对象可以当成IUserBO接口使用,也可以录成IUserBiz接口使用

IUserInfo userInfo = new UserInfo();
IUserBO userBO = (IUserBO)userInfo;
userBO.setPassword("abc");
IUserBiz userBiz = (IUserBiz)userInfo;
userBiz.deleteUser();

在实际使用中,我们更倾向于使用两个不同的类或接口,如下:

image-20221029230559305.png

1.2 绝杀技,打破你的传统思维

举例:电话设计

image-20221029225246280.png

这么设计的问题是IPhone接口不只有一个职责,分别为:一个是协议管理,一个是数据传送。

image-20221029225338160.png

这样设计引起类间耦合过重、类的数量增加,人为地增加了设计的复杂性

image-20221029225351474.png

这样设计,一个类实现两个接口,把两个职责融合在一个类中。

单一职责原则的好处

实现什么职责都有清晰明确的定义,这样类的复杂性降低,可读性提高,可维护性提高

1.3 我单纯,所以我快乐

单一职责适用于接口、类,同时也适用于方法。

image-20221029232008493.png

要修改用户名称,就调用changeUserName方法;要修改家庭地址,就调用changeHomeAddress方法;要修改单位电话,就调用changeOfficeTel方法。每个方法的职责非常清晰明确,不仅开发简单,而且日后的维护也非常容易。

1.4 最佳实践

大部分情况下类设计都是与单一职责相违背的,类的单一职责受到非常多因素的制约,现实你必须去考虑项目工期、成本、人员技术水平、硬件情况、网络情况甚至有时候还要考虑政府政策、垄断协议等因素。

对于单一职责原则,建议是接口一定要做到单一职责,类的设计尽量做到只有一个原因引起变化。

参考:

  1. 《设计模式之禅》第2版

标签:01,职责,之禅,接口,设计,设计模式,单一
From: https://www.cnblogs.com/okokabcd/p/16840242.html

相关文章

  • 重建控制文件出现ORA-01159、ORA-01517告警
    问题描述:将windows上的数据文件、控制文件拷贝到linux相应目录后,重建控制文件出现ORA-01159、ORA-01517告警,如下所示:源端:windows200332位+oracle10.2.0.432位目标端:ce......
  • 设计模式——单例模式
    懒汉式publicclassSingleton{privatestaticSingletoninstance;privateSingleton(){}publicstaticsynchronizedSingletongetInstance(){i......
  • java01
    ~~有出错的地方,我会及时改正owo~~java入门jdk配置&&dos指令程序是有序指令集合(cpu)95年有了java第一个版本java技术体系平台:javaSEjavaEEjavaME//ME不怎......
  • 2022-2023-1 20201324《信息安全系统设计与实现(上)》第6章
    目录1摘要2信号和中断进程中断进程的陷阱错误3Unix/Linux信号示例4Unix/Linux中的信号处理信号类型信号的来源段错误捕捉函数进程PROC结构体中的信号信号处理函数安装......
  • 20201317 LYX 第九周学习总结
    信号和信号处理知识点总结介绍信号和中断的统一处理,有助于从正确的角度看待信号;将信号视为进程中断,将进程从正常执行转移到信号处理;解释信号的来源;解释Unix/Linux......
  • 801. 二进制中1的个数Acwing
    #include<iostream>usingnamespacestd;constintN=1e5+10;intq[N];intlow(intx){returnx&(-x);}intmain(){intn;cin>>n;for(inti=0;......
  • CG2017 PA1-2 Crossroad (十字路口) 暴力求解2 线段、射线、直线、圆两两相交的简单
    题目是上一个随笔的题目,这次只判断交点个数不求出具体坐标,还是72.5分,看来卡O(n^2)复杂度卡得死死的。这次的代码给出了简单的线段、射线、直线、圆两两相交的判断交点个数......
  • windows10 + VS2015 配置OpenCV
    1、Opencv版本3.4.102、VS20153、Windows10首先下载Opencv官网即可下载下载后解压即可,无需安装 第一步:添加环境变量,变量名就是你自己解压OpenCV的目录里面的open......
  • 【设计模式】建造者模式
    建造者模式的意图建造者模式又被称呼为生成器模式,属于创建型模式。(使用多个简单对象一步一步构建成一个复杂的对象,这样像一间房子从地基到建造完成,这就是为啥被称呼为叫做......
  • MySQL高级篇-第01章 Linux下MySQL的安装与使用
    1.安装前的说明1.1Linux系统以及工具的准备安装并启动好两台虚拟机CentOS7(192.168.31.200,192.168.31.201)安装xshell和xftp工具1.2查看是否安装过MySQLrpm-qa|gre......