java 设计模式 学习分享(持续更新...)

开闭原则ocp

概述

是指一个软件实体如类、模块和函数应该对 扩展开放,对修改关闭。所谓的开闭,也正是对扩展和修改两个行为的一个原则。强调 的是用抽象构建框架,用实现扩展细节。可以提高软件系统的可复用性及可维护性。开闭原则,是面向对象设计中最基础的设计原则。它指导我们如何建立稳定灵活的系统。

个人理解

不对原有的接口进行改变,继承该类并Overriding的想要修改的具体方法使其达到新要求 重点是体现在细节方面

总结

对扩展开放,对修改关闭

依赖倒置原则dip

概述

是指设计代码结构时,高层模 块不应该依赖底层模块,二者都应该依赖其抽象。抽象不应该依赖细节;细节应该依赖 抽象。通过依赖倒置,可以减少类与类之间的耦合性,提高系统的稳定性,提高代码的 可读性和可维护性,并能够降低修改程序所造成的风险。

个人理解

列:XX学院开设java、python 课程现新开设 大数据课程 不应对原接口进行修改,体现在高层(调用层)对底层的调用中,改变调用方式如下
1、依赖注入
2、构造器注入
3、Setter 注入实现

总结

通过抽象使各个类或者模块不相互影响,实现松耦合

单一职责原则sip

概述

指不要存在多于一个导致类变更 的原因。假设我们有一个 Class 负责两个职责,一旦发生需求变更,修改其中一个职责的 逻辑代码,有可能会导致另一个职责的功能发生故障 。这样一来,这个 Class 存在两个导 致类变更的原因。如何解决这个问题呢?我们就要给两个职责分别用两个 Class 来实现, 进行解耦。后期需求变更维护互不影响。这样的设计,可以降低类的复杂度,提高类的 可读性,提高系统的可维护性,降低变更引起的风险。总体来说就是一个 Class/Interface/Method 只负责一项职责。

个人理解

明确划分 将动作和事件以及数据拆分开,顾名思义,各司其职。

总结

一个类、接口、方法只做一件事

接口隔离原则isp

概述

用多个专门的接口,而不使 用单一的总接口,客户端不应该依赖它不需要的接口。这个原则指导我们在设计接口时 应当注意一下几点: 1、一个类对一类的依赖应该建立在最小的接口之上。 2、建立单一接口,不要建立庞大臃肿的接口。 3、尽量细化接口,接口中的方法尽量少(不是越少越好,一定要适度)。 接口隔离原则符合我们常说的高内聚低耦合的设计思想,从而使得类具有很好的可读性、 可扩展性和可维护性。我们在设计接口的时候,要多花时间去思考,要考虑业务模型,包括以后有可能发生变更的地方还要做一些预判。

个人理解

要根据业务场景进行分析,把接口进行明确规划,某接口对某个类进行服务,不应该提供其他该类不需要的model
例子IAnimal 中包含 fly() dog 属于IAnimal 但IAnimal的fly()不适用于dog

总结

尽量保证接口的纯洁性,客户端不应该依赖不需要的接口。

迪米特法则lod

概述

指一个对象应该对其他对象保持最少的了解,又 叫最少知道原则(Least Knowledge Principle,LKP),尽量降低类与类之间的耦合。迪 米特原则主要强调只和朋友交流,不和陌生人说话。出现在成员变量、方法的输入、输 出参数中的类都可以称之为成员朋友类,而出现在方法体内部的类不属于朋友类。
个人理解
各司其职,明确目标 列入boss让leader 统计开设多少堂课程,boss只需要反馈不需要对课程进行处理,leader去获取课程结果反馈boss即可。boss对leader类具体实现一无所知。

总结

又叫最少知道原则,一个类对其所依赖的类知道得越少越好。

里氏替换原则lsp

概述

指如果对每一个类型为 T1 的对象 o1,都有类型为 T2 的对象 o2,使得以 T1 定义的所有程序 P 在所有的对象 o1 都替换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。 定义看上去还是比较抽象,我们重新理解一下,可以理解为一个软件实体如果适用一个 父类的话,那一定是适用于其子类,所有引用父类的地方必须能透明地使用其子类的对象,子类对象能够替换父类对象,而程序逻辑不变。 总结如下: 引申含义:子类可以扩展父类的功能,但不能改变父类原有的功能。
1、子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
2、子类中可以增加自己特有的方法。
3、当子类的方法重载父类的方法时,方法的前置条件(即方法的输入/入参)要比父类 方法的输入参数更宽 松。
4、当子类的方法实现父类的方法时(重写/重载或实现抽象方法),方法的后置条件(即 方法的输出/返回值)要 比父类更严格或相等。
使用里氏替换原则有以下优点: 1、约束继承泛滥,开闭原则的一种体现。 2、加强程序的健壮性,同时变更时也可以做到非常好的兼容性,提高程序的维护性、扩 展性。降低需求变更时引入的风险。

个人理解

子类替换父类,且能扩展,使其父类逻辑不变,那么其也适用于子类。

总结

子类可以扩展父类的功能但不能改变父类原有的功能。

合成复用原则casp

概述

指尽量使用对象组 合(has-a)/聚合(contanis-a),而不是继承关系达到软件复用的目的。可以使系统更加灵 活,降低类与类之间的耦合度,一个类的变化对其他类造成的影响相对较少。 继承我们叫做白箱复用,相当于把所有的实现细节暴露给子类。组合/聚合也称之为黑箱 复用,对类以外的对象是无法获取到实现细节的。要根据具体的业务场景来做代码设计, 其实也都需要遵循 OOP 模型。还是以数据库操作为例

个人理解

calss(包含具体实现) --> abstract 为接口 具体表现放在实现类中

总结

尽量使用对象组合、聚合,而不使用继承关系达到代码复用的目的。
思维导图移步------->https://mubu.com/doc/nsSN4HYZ50
案例移步----->git@github.com:qizhenikanriluo

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值