2.设计模式-七大原则
创始人
2025-05-29 08:29:56
0

设计模式


软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。

打个比方就像盖大厦和小木屋,当功能简单,函数和代码少时,我们能较轻松的直接上手;但如果是像大厦那样,功能复杂,需求可能变化且代码量大时,我们就不能直接上手就来,需要像建筑图纸那样提前规划设计,那设计模式就像软件(程序)的建筑图纸。

设计模式的目的是为了让软件(程序)具有更好的:

  1. 代码重用性
    相同功能的代码,不用多次编写,降低冗余
  2. 可读性
    编程规范性, 便于其他程序员的阅读和理解
  3. 可扩展性
    当需要增加新的功能时,非常的方便,也称为可维护性
  4. 可靠性
    当我们增加新的功能后,对原来的功能没有影响
  5. 使程序呈现高内聚,低耦合的特性
    模块内部紧密,但模块间依赖小,一者出错不影响他者

单一职责原则

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

单一职责原则注意事项和细节

  1. 降低类的复杂度,一个类只负责一项职责。
  2. 提高类的可读性,可维护性
  3. 降低变更引起的风险
  4. 通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单一职责原则;只有类中方法数量足够少,可以在方法级别保持单一职责原则
    在这里插入图片描述

接口隔离原则

接口隔离原则(Interface Segregation Principle),即客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上

比如:类A通过接口 I I I依赖类B,类C通过接口 I I I依赖类D,如果接口 I I I对于类A和类C来说不是最小接口,那么类B和类D必须去实现他们不需要的方法。
在这里插入图片描述

按隔离原则应当这样处理:将接口 I I I拆分为独立的几个接口,将类分别与他们需要的接口建立依赖关系,也就是采用接口隔离原则。
在这里插入图片描述

依赖倒转原则

依赖倒转原则(Dependence Inversion Principle),依赖倒转(倒置)的中心思想是面向接口编程,所谓“倒转”是指抽象不应该依赖细节,而是细节应该依赖抽象。也就是高层模块不应该依赖低层模块,二者都应该依赖其抽象。因为相对于细节的多变性,抽象的东西要稳定的多。
比如有个Person类,可以接受Email、QQ和微信的消息。如果都为其提供一个专门的方法,就会让代码非常的冗余:
在这里插入图片描述

可以引入一个IReceiver接口,让Person类依赖该接口。这样QQ、微信和Email各自实现IReceiver里面的方法即可:
在这里插入图片描述

里氏替换原则

里氏替换原则(Liskov Substitution Principle)要求所有引用基类的地方必须能透明地使用其子类的对象。也就是在继承关系中,子类尽量不要重写父类的方法。继承实际上让两个类耦合性增强了,特别是运行多态比较频繁的时,整个继承体系的复用性会比较差。
比如一种极端情况:一个类继承了另一个类,但却重写了所有方法,那么继承的意义何在?说好的复用呢?
在这里插入图片描述

解决方法是把原来的父类和子类都继承一个更通俗的基类,在适当的情况下,可以通过聚合,组合,依赖等来代替。
在这里插入图片描述

开闭原则

开闭原则(Open Closed Principle)一个软件实体如类,模块和函数应该对扩展开放(对提供方),对修改关闭(对使用方)。也就是当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。用抽象构建框架,用实现扩展细节。
开闭原则是编程中最基础、最重要的设计原则。编程中遵循其它原则,以及使用设计模式的目的就是遵循开闭原则。

举个违反开闭原则的例子:
矩形Retangle和圆形Circle继承了图形类Shape(提供方),画图类GraphicEditor(使用方)会调用相关属性。
在这里插入图片描述
但是如果再新增一个三角形,就要在使用方GraphicEditor新增对应方法,修改地方较多,违背开闭原则。
在这里插入图片描述

改进:把Shape做成抽象类并提供抽象方法draw,让子类去实现即可。当新增图形种类时,只需让新的图形类继承Shape,并实现draw方法即可。使用方的代码就不需要修改,满足开闭原则。
在这里插入图片描述

迪米特法则

迪米特法则(Demeter Principle)又叫最少知道原则,即一个类对自己依赖的类知道的越少越好,核心是降低类之间的耦合。也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内部。对外除了提供的public 方法,不对外泄露任何信息。
避免与非直接朋友的耦合,只与直接的朋友通信,所谓的直接朋友是出现成员变量,方法参数,方法返回值中的类。而出现在局部变量中的类不是直接的朋友。也就是说,陌生的类最好不要以局部变量的形式出现在类的内部

比如有学院员工类和学校员工类,然后各有一个管理类有可以获取其所有员工,学校员工管理类有方法打印全部员工。
在这里插入图片描述

具体代码:

void printAllEmployee(CollegeManager sub) {//获取到学院员工List list1 = sub.getAllEmployee();System.out.println("---学院员工---");for (CollegeEmployee e : list1) {System.out.println(e.getId());}//获取到学校总部员工List list2 = this.getAllEmployee();System.out.println("---学校员工---");for (Employee e : list2) {System.out.println(e.getId());}}

分析SchoolManager类,发现Employee和CollegeManager都是它的直接朋友(出现在参数和返回值中),但CollegeEmployee不是直接朋友,是以局部变量的形式,违背了迪米特原则。
你以前是不是就这样写的,细思极恐,当头一棒

改进:避免依赖CollegeEmployee,封装在CollegeManager中,对外提供public方法即可。
在这里插入图片描述

void printAllEmployee(CollegeManager sub) {sub.printEmployee();//获取到学校总部员工List list2 = this.getAllEmployee();System.out.println("---学校员工---");for (Employee e : list2) {System.out.println(e.getId());}}

合成复用原则

合成复用原则(Composite Reuse Principle)就是是尽量使用合成/聚合的方式,而不是使用继承
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果对于类间关系(比如上面聚合组合),或不懂怎么画UML类图,可参考我的另一篇博客:一文掌握UML类图:PlantUML实操分享

小结

设计原则核心思想

  1. 针对接口编程,而不是针对实现编程 。
  2. 把应用中可能需要变化的代码和不需要变化的代码分开独立。
  3. 都是为了交互对象间解耦合而操心。

相关内容

热门资讯

企业IP打造指南:小公司低成本... 小公司做企业IP,不是为了装门面,而是让客户在没见到你之前,就能通过内容知道你是谁、你解决什么问题、...
官方:赵心童入选世界斯诺克名人... 北京时间5月8日消息,世界斯诺克巡回赛(WST)今日正式公布了2025/26赛季年终奖项及名人堂更新...
小灰熊AI学员王锋:希望能跟上... 35了,老程序员了。 从进入互联网行业到现在,其实已经做了很多年移动端开发。最早那几年,安卓行业发展...
原创 2... 2026年全国两会把稳定房地产市场列为重点工作,政府工作报告明确提出因城施策控增量、去库存、优供给。...
一年翻倍,六年未归——徽商银行... 文:向善财经 今年的港股市场,与A股市场出现了明显的分化。 A股这边,科技板块在AI浪潮中热闹非凡;...
古井贡酒2025:在行业深度调... 以“稳”为底、以“新”为翼。 文/每日财报 杜康 在行业库存高企、价格倒挂的背景下,当多数酒企在为...
好上好8408万收购鼎瑞芯加码... 5月7日晚,好上好(001298.SZ)抛出一份收购公告,拟以8408万元现金收购深圳市鼎瑞芯科技有...
全面大撤离!李嘉诚英国“套现”... 突发,李嘉诚又卖了。 这次,套现了455亿。 金额不少,但更值得关注的是透露着不同寻常的信号。 因为...
油气价格上涨加剧法国一季度贸易... 据新华社,法国海关7日发布的数据显示,受中东局势推高国际油气价格影响,法国今年第一季度贸易逆差扩大至...
昆仑芯启动科创板IPO上市辅导... 5月8日,据证监会官网显示,昆仑芯(北京)科技股份有限公司于2026年5月7日正式启动科创板上市辅导...
贵州茅台酒股份有限公司关于回购... 来源:上海证券报 证券代码:600519 证券简称:贵州茅台 公告编号:临2026-016 贵州茅...
百度昆仑芯启动科创板上市辅导,... 5月8日,证监会官网显示,昆仑芯(北京)科技股份有限公司 (下称“昆仑芯”)于2026年5月7日正式...
滕州信华的承压时刻:罚单、失信... 2026年4月末,滕州信华美元债单日跌近2%,关联方被列“老赖”。半年前,这家AA+城投曾因非市场化...
002808,或被终止上市! 【导读】因触及财务类退市指标,*ST恒久或被终止上市 中国基金报记者 李智 又一A股或被终止上市。 ...
院士团队掌舵,溧阳这家企业已完... 近日,溧阳天目先导电池材料科技有限公司(下称“天目先导”)官宣完成B轮融资,投资方包括知卓创新资本、...
工商银行全新推出“工盈研选”品... 深圳商报·读创客户端记者 詹钰叶 近日,工商银行重磅推出「工盈研选」基金销售服务品牌,以客户盈利为核...
和讯信息胡云龙:逼空走势,周五... 今天市场出现逼空走势,场内投资者因持有筹码而尤为受益。五一前布局的投资者当前收获颇丰。然而,随着上证...
今晚,油价上调! 4月21日国内成品油价格下调以来,国际市场原油价格剧烈震荡,前期大幅上涨后近日有所回落,本次调价的前...
南方东英旗下两倍做多海力士,成... 【导读】南方东英旗下两倍做多海力士,成为全球最大的个股杠杆及反向产品 中国基金报记者 伊万 人工智能...
原创 金... 黄金,这东西从古至今就没离开过中国人的生活。从老辈人压箱底的小黄鱼,到如今年轻人结婚绕不开的“三金”...