设计模式之禅(六大设计原则)

article/2025/8/22 15:43:30

1.单一职责原则(Single Responsibility Principle)

也就是职责划分要明确,单一职责原则提出了一个编写程序的标准,用“职责”或者“变化原因”来衡量接口或者类设计的是否优良,但是“职责”或者“变化原因”都是不可度量的,因项目而异,因环境而异。

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

2.里氏替换原则(Liskov Substitution Principle)

java三大特征:封装、继承、多态

该原则主要针对继承这一关系。

通俗点讲就是:只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误和异常,使用者根本不需要知道是父类还是子类。但是,反过来就不行,有子类的地方,父类未必就能适应。

规范:

  1. 子类必须完全实现父类的方法
  2. 子类可以有自己的个性
  3. 覆盖或实现父类的方法是输入参数可以被放大。子类中的方法的参数必须与超类中被重写的方法的参数相同或者更宽松(注意重载和重写这两个概念)
  4. 重写或实现父类的方法时输出结果可以被缩小(return<=)

采用里氏替换原则时,尽量避免子类的“个性”,一旦子类有“个性”,这个子类和父类之间的关系就很难调和了

3.依赖倒置原则(Dependence Inversion Principle)

即面向接口编程,传值直接使用接口或者抽象类

规范:

  1.每个类尽量都有接口或抽象类,或者抽象类和接口两者都具备

  2.变量的表面类型尽量是接口或者抽象类

  3.任何类都不应该从具体类派生

  4.尽量不要重写基类的方法

  5.结合里氏替换原则使用

4.接口隔离原则(Interface Segregation Principle)

何为接口:1.实例接口(new关键字产生一个实例);2.类接口(interface关键字定义的接口)

该原则就是将接口的职责细分,保证接口的纯洁性:

  1.接口尽量小(不能违反单一职责原则)

  2.接口要高内聚(提高接口、类、模块的处理能力,减少对外的交互。也就是你只用知道结果就好,不用管它是怎么实现的)

  3.定制服务(根据客户端来划分接口,按照权限划分接口)

  4.接口设计是有限度的(无标准视情况而定)

实践中的规则:

  1.一个接口只服务于一个子模块或者业务逻辑

  2.通过业务逻辑压缩接口中的public方法,接口要时常去回顾,尽量让接口达到“最小”,而不是“臃肿”的一大堆方法

  3.已经被污染的接口,尽量去修改,若变更的风险较大,则采用适配器模式进行转化处理

  4.视情况而定,不用盲目抄袭

5.迪米特尔法则(Law of Demeter Principle || 最少知道原则)

直接的朋友:成员变量、方法参数、方法返回值

只和直接的朋友交流。陌生的类最好不用以局部变量的方式出现在类的内部,尽量少对外公布public方法和非静态的public变量,如果一个方法放在本类中,既不增加类间关系,也不对本类产生负面影响,那就放置在本类。(类间解耦,弱耦合)

6.开闭原则(Open Closed Principle)

java世界中最基础的设计原则,他指导我们如何创建一个稳定的、灵活的系统

此时有一个需求书店打9折促销,面对需求变化,我们一般有三种解决办法:

  1.修改接口(不可行)

  2.修改实现类(不是最优)

  3.通过拓展实现变化(好办法):增加一个子类去重写getPrince方法,通过这个拓展类来产生新的对象,实现业务变化对系统的最小化开发

变化的三种类型:

  1.逻辑变化(只变化一个逻辑,而不涉及其他模块)

  2.子模块变化(一个模块变化,会对其他的模块产生影响)

  3.可见视图变化(如jsp程序、Swing界面)

开闭原则规范:

  1.抽象规范:a.通过接口或者抽象类进行约束拓展,对拓展进行边界限定,不允许出现在接口或抽象类不存在的public方法;b.参数类型、引用对象尽量使用接口或者抽象类,而不是具体实现类;c.抽象类要保持稳定,一旦确定即不允许更改

  2.使用元数据控制模块行为:

            元数据:用来描述环境和数据的数据,通俗地来讲就是配置参数,参数可以从文件中得,也可以从数据库中获得。

            一句话“约定大于配置,配置大于代码”,约定:就是各种约束文件;配置:就是各种xml文件配置;代码:手敲的代码

  3.制定项目章程

  4.封装变化:a.将相同的变化封装当一个接口或者抽象类中;b.将不同的变化封装到不同的接口或者抽象类中,不应该有两个不同的变化出现在同一接口或者抽象类中(类似手机:不同的品牌,不同的厂商....)


http://chatgpt.dhexx.cn/article/X1Xq4kRf.shtml

相关文章

什么是ASCII码

ASCII码英文全称America Standard Code for Information Interchange&#xff0c;中文意思&#xff1a;美国信息交换标准码。它已被国际标准化组织&#xff08;ISO&#xff09;定为国际标准&#xff0c;称为ISO 646标准。适用于所有拉丁文字字母&#xff0c;ASCII码有7位码和8位…

最全ASCii 码表和说明

A的ASCII码是65&#xff0c;a的ASCII码是97。 ASCII码表中&#xff0c;小写字母排在大写字母的后面&#xff0c;一个字母的大小写数值相差32&#xff0c;一般知道大写字母的ASCII码数值&#xff0c;其对应的小写字母的ASCII码数值就算出来了&#xff0c;是大写字母的ASCII码数…

ASCII码

字符编码即ASCII码&#xff08;American Standard Code for Information Interchange,美国信息交换标准码&#xff0c;国际通用的计算机内的字符数字的二进制编码&#xff09;&#xff0c;它是7位二进制编码&#xff0c;总共有128个符号&#xff0c;包括英文26个大写字母&#…

什么叫ASCII码

一个字符A&#xff0c;以 字符和整型都可以输出。因为字符A也是以二进制存储&#xff0c;这个二进制对应一个整数 那究竟什么是ASCII码&#xff1f; ASCII不是一个值&#xff0c;而是一种规定。 ASCII规定了不同字符是使用哪个整数值表示 它规定&#xff1a; A --65 B --…

关于ASCII码的转换

目录 ASCII码表ASCII码与字符之间的转换 ASCII码表 ASCII码与字符之间的转换 python中chr()和ord()两个函数可以实现ASCII码与字符之间的转换&#xff0c; 两者之间的关系 转换举例 stringbsuahisas num_list[ord(i) for i in string] str_list[chr(i) for i in num_list] p…

ASCII码介绍

ASCII码 概念 ASCII(American Standard Code for Information Interchange)的缩写&#xff08;美国标准信息交换代码&#xff09;&#xff0c;已被国际标准化组织ISO采纳&#xff0c;作为国际通用的信息交换标准代码。 诞生背景 计算机对数据的识别、运算和存储都建立在二进制…

ASCII编码

ASCII编码 ASCII编码的概念对控制字符的解释详细说明 ASCII编码的概念 计算机是以二进制的形式来存储数据的&#xff0c;它只认识 0 和 1 两个数字&#xff0c;我们在屏幕上看到的文字&#xff0c;在存储之前都被转换成了二进制&#xff08;0和1序列&#xff09;&#xff0c;在…

ascii码a和A为什么差32而不是26

ascii码a和A为什么差32而不是26&#xff1f; A的ASCII码是65&#xff0c;a的ASCII码是97&#xff1b; ASCII码表中&#xff0c;一个字母的大小写数值相差32&#xff0c;一般知道大写字母的ASCII码数值&#xff0c;其对应的小写字母的ASCII码数值就算出来了&#xff0c;是大写字…

ASCII码详解

ASCII简介 ASCII 码使用指定的 7 位或 8 位二进制数组合来表示 128 或 256 种可能的字符。标准 ASCII 码也叫基础ASCII码&#xff0c;使用 7 位二进制数来表示所有的大写和小写字母&#xff0c;数字 0 到 9、标点符号&#xff0c; 以及在美式英语中使用的特殊控制字符。其中&a…

a到z的ascii码值是多少_a和A对应的ASCII码数值分别是多少啊?

展开全部 A的ASCII码是65&#xff0c;a的ASCII码是97。 ASCII码表中&#xff0c;小写字母32313133353236313431303231363533e78988e69d8331333366303066排在大写字母的后面&#xff0c;一个字母的大小写数值相差32&#xff0c;一般知道大写字母的ASCII码数值&#xff0c;其对应…

输出ASCII码

输出字符的ASCII码 从键盘输入一个字符&#xff0c;按规定格式输出这个字符及它的ASCII码。例如&#xff1a; 输入 A 输出 “The ASCII of A is 65”.//输出的数值在双引号以内// 代码&#xff1a; ​ #include <stdio.h>int main() {char a;scanf("…

ascii码中的A的代码是什么?

ASCII&#xff08;American Standard Code for Information Interchange&#xff0c;美国标准信息交换代码&#xff09;是基于拉丁字母的一套电脑编码系统&#xff0c;主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统&#xff0c;并等同于国际标准ISO/IEC…

system函数阻塞问题

system()函数是阻塞方式进行的&#xff0c;他会新建一个进程! system代码执行完毕才继续执行&#xff01; 注意一点&#xff0c;如下的命令&#xff1a; #include <bits/stdc.h> #include <windows.h> using namespace std; int main() {std::cout << "…

Linux system函数的执行命令并获取状态

在linux中&#xff0c;可以通过调用system函数执行linux命令&#xff0c;但是如何获取执行命令的结果状态呢&#xff0c;也就是是否执行成功。 #include <stdio.h> #include <stdlib.h>int main() {int ret -1;ret system("cat /proc/mounts | grep sda"…

system函数常见用法

system函数 1.用来执行windows常用命令 我们知道 C语言是没有自己的窗口的&#xff0c;比如我们用printf函数在黑框上输出Hello World是其实是调用了windows的DOS交互窗口。 我们在C语言程序中用system可以给操作系统发送指定&#xff0c;其作用与直接在DOS窗口发送指令进行交…

system函数的总结

system函数的总结 2014-10-30 20:22 1216人阅读 评论(2) 收藏 举报 分类&#xff1a; 系统编程&#xff08;17&#xff09; 最近在看APUE第10章中关于system函数的POSIX.1的实现。关于POSIX.1要求system函数忽略SIGINT和SIGQUIT&#xff0c;并且阻塞信号SIGCHLD的论述&…

c/c++中system函数

原文地址&#xff1a;http://www.cnblogs.com/tianzeng/p/9550379.html 在windows下的system函数中命令可以不区别大小写&#xff01; 函数名&#xff1a; system 功 能&#xff1a; 发出一个DOS命令 用 法&#xff1a; #include <stdlib.h>int system(char *command…

system函数返回值,Linux

理论 我们先看下man手册是怎么说的man system RETURN VALUEThe value returned is -1 on error (e.g., fork(2) failed), and the return status of the command otherwise. This latter return status is in the format speci‐fied in wait(2). Thus, the exit code of …

Linux---system函数

一、关于system函数 #include <stdlib.h>int system(const char *command);返回值&#xff1a;成功&#xff0c;返回进程的状态值&#xff1b;当sh不能运行时&#xff0c;返回127&#xff1b;失败&#xff0c;返回-1。 源代码如下&#xff1a; int system(const char …

system函数的详细使用

目录 函数接口 作用 返回值 测试代码 参数 MODE命令 color命令 函数接口 _DCRTIMP int __cdecl system( _In_opt_z_ char const* _Command ); system函数已经被收录在标准c库中&#xff0c;头文件为<stdlib.h> 作用 执行系统命令调用命令处理器来执行命令。 如果…