1. 开闭原则 OCP
开闭原则:(Open-Closed Principle)对现有程序的扩展开发,对修改关闭。
老子的代码写好了,就尽量不要改老子的代码了,要改自己写一个去。虽然你可以改老子的代码
“当需要修改或增强系统的功能时,应优先考虑通过增加新代码(比如添加新的类、方法或模块)的方式来实现需求变更,而不是直接修改原有的已验证无误的基础代码部分。”
2.里氏替换原则 LSP
里氏替换原则:(Liskov Substitution Principle)任何父类出现的地方,子类一定可以出现。子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法。
老爹能干的,他的儿子也能干,虽然干的活一模一样,但是儿子还可以干别的。
里氏替换原则强调在软件设计中,子类应当能够在其父类出现的地方正确地工作,且不会引起意外的行为。
“老爹能干的,他的儿子也能干”,这表示子类至少要完全实现父类的功能,即子类对于父类的接口而言是兼容的,可以无差别地替换父类实例;而“虽然干的活一模一样,但是儿子还可以干别的”则体现了子类不仅可以完成父类定义的任务,而且还能根据需要扩展新的功能或行为,但这些扩展不应该破坏原有的继承体系和契约约定。
总结来说,里氏替换原则要求在设计时确保任何基类的引用都能够透明地使用其子类的对象,同时子类可以在不违反契约的情况下扩展功能,保持系统的开放性和可维护性。
3. 依赖倒置原则 DIP
依赖倒置原则:(Dependence Inversion Principle)高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。针对接口编程,不要针对实现编程。
我想揍你,我该怎么揍你啊?我可以用我的拳头揍你,但是我也可以使用棍子揍你。
SSM 开发中控制层
通过服务层接口
来调用服务层实现类的方法
。
"我想揍你"可以看作是一个高层模块的需求,而"我可以用我的拳头揍你"则是具体的一种实现方式。
抽象需求:揍你
这代表了系统中的一种行为或操作,即执行揍人的动作。 具体实现1:用拳头揍你
这是满足揍人需求的一个具体方法,可以视为一个低层模块的具体实现。 具体实现2:用棍子揍你
同样也是满足揍人需求的不同方式,另一个低层模块的具体实现。 高层模板“我想揍你”依赖于“揍你”的这个接口,而低层模块,即揍你的“实现”方式(通过拳头 or 棍子)也依赖于“揍你”这个接口。
高层模块调用了接口中的抽象方法,实际上调用了接口实现类的方法。
高层模块(例如:我控制我揍你)不应该直接依赖于低层的具体实现(例如:拳头攻击或棍子攻击),而是应该依赖于抽象接口(例如:攻击策略接口)。
4. 接口隔离原则 ISP
接口隔离原则:(Interface Segregation Principle)客户端不应该被迫依赖于它不使用的方法;一个类对另一个类的依赖应该建立在最小的接口上。
(妈妈,你怎么准备这么多东西啊,我只是去上学,不是搬家啊QAQ,带不了了。这些东西我放家里了,那些我东西才要带到学校。)
“妈妈准备的东西”:代表了一个大而全的接口,包含了多种功能或职责。
“我只是去上学,不是搬家”:意味着作为客户端(即“我”)只需要其中一部分功能,而非全部。
“这些东西我放家里,那些我才带到学校”:表示应该把不必要的接口部分“留在家里”,只携带符合需求的、精简的接口(方法)到“学校”(即实际使用的代码模块中)。
所以,通过这个比喻,我们可以理解为接口隔离原则提倡我们将一个大的接口拆分成多个更小、更具有针对性的接口,使得每个接口都只包含一组相关的操作,避免了不使用的方法对客户端产生的影响和耦合。
接口隔离原则(ISP)的核心思想,即避免一个接口包含过多不相关的职责,导致客户端不得不依赖它不需要的方法。通过把不必要的部分“留在家里”,只携带符合需求的、更小的接口到“学校”(类或模块中),体现了接口隔离的原则。
在实际编程实践中,接口隔离原则更加关注的是如何设计和拆分接口,使得每个接口都具有良好的内聚性,从而降低耦合度,提高代码的可维护性和复用性。
5.合成复用原则 CRP
合成复用原则: (Composite Reuse Principal)组合/聚合复用原则,尽量使用对象组合,而不是继承来达到复用的目的。
(这个工具类大家直接过来拿去用吧,不用自己重复写了)
通过工具类的对象来调用工具类的方法来解决问题,而不是继承工具类来使用工具类的方法。
6.迪米特法则 LoD
迪米特法则:(Law of Demeter)最少知识原则
典型的定义:
- 不要和“陌生人”说话;
- 只与你的直接朋友通信;
- 每一个软件单位对其他的单位都只有最小的知识,而且局限于那些与本单位密切相关的软件单位。
(我是社恐,朋友不多但关系较好,有问题直接找他们帮忙,当然他们有能力独立解决问题,而我也不敢找别人。)
怎么?还没理解??
- 我又想到好法子了,但是我不改上面的东西了,我要再下面写新的了(开闭原则,对修改关闭,对扩展开放);
- 我的好法子其实也没有什么变化,好像是骗你的,我就是复制一下上面的东西展示给你吧,此处省略两千字。。。虽然我确实新加了一些新的东西。(里氏替换原则,假设这句话是子类,上面的是父类,那么子类没有重写父类的方法,而且是原封不动的使用父类的方法);
- 其实我确实没有啥好法子了,我还是给个连接让你看看我之前怎么写的吧。(依赖倒置原则,我通过一个连接(抽象)连接到具体的知识内容(实现类))
- 我感觉没必要写更多了,写多了好像跟这篇文章没有关系了(接口隔离法则,客户端不应该直接依赖哪些它不需要的接口)
如果有错误的地方,欢迎大家指出,我会修改,谢谢大家花时间阅读。