`

Java架构的算法和设计模式读书笔记一

阅读更多

1.架构中的设计原则:

1.1.单一职责原则

       单一职责原则的核心思想就是:系统中的每一个对象都应该只有一个单独的职责,而所有对象所关注的就是自身职责的完成。英文缩写SRP  Single Responsibility Principle

单一职责原则——》“高内聚,低耦合”,每个类应该只有一个职责,此外只能提供一种功能,而引起类变化的原因应该只有一个。在设计模式中,所有的设计模式都遵循这一原则。

1.2.里氏替换原则

里氏替换原则的核心思想就是:在任何父类出现的地方都可以用它的子类替代。

英文缩写:LSP   Liskov Substitution Principle

       里氏替换原则——》同一个继承体系中的对象应该有共同的行为特征 。

       在里氏替换原则中,所有引用基类的地方必须能够透明地使用其子类对象 。也就是,只要父类出现的地方,子类就能够出现,而且替换为子类不会产生任何错误或异常。反过来,子类出现的地方,替换为父类就可能出现问题。

4层含义:

      (1)子类必须完全实现父类的方法

       

      (2)子类可以有自己的特性

       也就是说再类的子类上,可以定义其他的方法或属性。

 

      (3)覆盖或者实现父类的方法时输入参数可以被放大,反之则不行

    

      (4)覆写或者实现父类的方法时输出结果可以被缩小

1.3.依赖注入原则

依赖注入原则的核心思想就是:要依赖于抽象,不要依赖于具体实现。它的英文缩写DIP  Dependence Inversion Principle(依赖反转原则)。

依赖注入原则——》在应用程序中,所有的类如果使用或依赖于其他的类,则都应该依赖于这些其他的类的抽象类,而不是这些其他类的具体实现类。抽象层次应该不依赖于具体的实现细节,这样才能保证系统的可复用性和可维护性。为了实现这一原则,就要求开发人员在编程时针对接口编程,而不针对实现编程。

依赖注入原则有如下三点说明:

    1.高层模块不应该依赖底层模块,两者都应该依赖于抽象(抽象类或接口)

    2.抽象(抽象类或接口)不应该依赖于细节(具体实现类)。

    3.细节(具体实现类)应该依赖抽象。

    依赖注入原则的本质是通过抽象(抽象类或接口)使各个类或模块的实现彼此独立,不互相影响,实现模块间的松耦合。这个原则是6个原则中最难实现的了,若果没有实现这个原则,也就意味着开闭原则(对扩展开放,对修改关闭)也无法实现。

依赖注入原则用如下三种方式实现。

(1)通过构造函数传递依赖对象

         例如在构造函数中的需要传递的参数是抽象类或接口的方式实现。

2)通过setter方法传递依赖对象。

     即在我们设置的setXXX方法中的参数为抽象类或接口,来实现传递依赖对象

 (3)接口声明实现依赖对象

 

1.4.接口分离原则

接口分离原则核心思想就是:不应该强迫客户程序依赖它们不需要使用的方法。

英文缩写ISPInterface Segregation Principle

接口分离原则——》一个接口不需要提供太多的行为,一个接口应该只提供一种对外的功能,不应该把所有的操作都封装到一个接口中。

接口分两种:

(1)对象接口

         Java中声明的一个类,通过new关键字产生的一个实例,它是对一个类型的事务的描述,这也是一种接口。

     (2)类接口

          这种接口是通过关键字interface定义的接口。

          接口分离原则要求的是在一个模块中应该只依赖它需要的接口,以保证接口的小纯洁。而且需要保证接口应该尽量小,即设计接口的时候让接口尽量细化,不要定义太臃肿的接口。

     单一职责原则要求的是类和接口职责单一,注重的是职责,是业务逻辑上的划分。而接口分离原则要求的是接口的方法尽量少,针对一个模块尽量有用。

     接口分离原则的规范:

       (1)接口尽量小:主要是为了保证一个接口只服务于一个子模块或者业务逻辑。

       (2)接口高内聚:接口高内聚是对内高度依赖,对外尽可能隔离。即一个接口内部声明的方法相互之间都与某一个子模块相关,且是这个子模块必需的。

       (3)接口设计是有限度的:如果完全遵循接口分离原则的话,会出现一个问题,即接口的设计力度越来越小,这样就造成了接口数据剧增,系统复杂度一下子增加了,而这不是真实项目所需要的,所以在使用这个原则的时候,还要在特定的项目中,根据经验或者尝试去判断,但没有一个固定的标准。

1.5.迪米特原则

迪米特原则LOD  Law of Demeter.

迪米特原则的核心思想就是:一个对象应当对其他对象尽可能少地了解。意思就是降低各个对象之间的耦合,提高系统的可维护性。在模块之间,应该只通过接口通信,而不理会模块的内部工作原理,它可以使各个模块耦合程度降到最低,促进软件的复用。

迪米特原则的核心观念就是类间解耦,弱耦合。只有弱耦合了以后,类的复用性才可以提高。

在应用迪米特法则时的注意事项如下:

    1.在类划分上,应该创建有弱耦合的类。

    2.在类的结构设计上,每一个类都应当尽量降低成员的访问权限。

    3.在类的设计上,只要有可能,一个类应当设计成不变的类。

    4.在对其他类的引用上,一个对对象对其他对象的引用应当降到最低。

    5.尽量降低类的访问权限。

    6.谨慎使用序列化功能。

    7.不要暴露类成员,而应该提供相应的访问器(属性)

1.6.开闭原则

开闭原则缩写OCP  Open for ExtensionClosed for Modification

开闭原则的核心思想是:一个对象对扩展开放,对修改关闭。

开闭原则的意思就是:对类的改动是通过增加代码进行的,而不是改动现有的代码,也就是说,软件开发人员一旦写出了可以运行的代码,就不应该去改变它,而是要保证它能一直运行下去,如何才能做到呢?需要借助于抽象和多态,即把可能变化的内容抽象出来,从而使抽象的部分是相对稳定的,而具体的实现层则是可以改变和扩展的。

根据开闭原则,改变软件时,应通过扩展的方式来实现软件的改变,而不应靠修改原有代码来实现变化。

开闭原则是前5种原则的一个抽象总结,前5种是开闭原则的一些具体实现。

分享到:
评论

相关推荐

    java面试大全-黑马

    去掉了EJB 2.x、JSF等无用内容或过时内容,补充了数据结构和算法、大型网站技术架构、设计模式、UML、Spring MVC等内容并对很多知识点进行了深入的剖析,例如hashCode方法的设计、垃圾收集、并发编程、数据库事务等...

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    设计模式和常用的设计模式.mp4 │ Java面试题16.http get post请求的区别.mp4 │ Java面试题17.说说你对Servlet的理解.mp4 │ Java面试题18.Servlet的生命周期.mp4 │ Java面试题19.forward和redirect的区别.mp4 │ ...

    java笔试题算法-javase:javase的笔记

    ​ 本课程最贴合企业级需求的java基础课程,向上有完整的知识点覆盖,除了语言自身,数据结构、算法、设计模式、框架思想,多领域实现;向下,生动清晰阐述JVM原理,内存管理,垃圾回收算法,系统调用,多线程及...

    JAVA架构师核心面试知识整理新-加密.pdf

    Java集合面试题解析,并发编程高级面试解析,JVM常问高频题解析,Spring高级面试解析,MyBatis高级面试解析,Dubbo面试问题解析,RabbitMQ知识点汇总,数据库知识点汇总,设计模式知识点笔记汇总,常见面试算法题...

    高级java笔试题-Java-Note:一个Java程序员的笔记本

    设计模式最佳实践: 《Redis 设计与实现》参考: 社区 book list 互联网的四大特征: 开放的精神,分享的心态,全球化的眼光,责任感。 —— 马云 Java: 深入理解Java虚拟机 第二版,周志明 码出高效-Java开发手册, ...

    java软件笔试题-MyNotebook:我大学时期的笔记本

    2:设计模式与架构 part 3:编程语言 & 前端 & 机器学习 C++笔记 part 4: 数据结构与算法 part 5: 笔试/面试 part 6:专业基础 输入URL到页面加载完成的过程 part 7:读书笔记 thinking in java effective java ...

    java学生宿舍管理系统源码-zcnote:笔记类,包括mysql,php,nginx,linux,go,python,算法等等

    java学生宿舍管理系统 源码 目录 c socket css golang base beego bolt confd etcd geecache gin gmq grpc influxdb ...java ...微服务学习笔记系列 ...数据结构和算法 ...架构模式 ...设计模式 目录自动生成器

    asp.net知识库

    Essential .NET 读书笔记 [第一部分] NET FrameWork的Collections支持 .NET的反射在软件设计上的应用 关于跨程序集的反射 实现C#和VB.net之间的相互转换 深入剖析ASP.NET组件设计]一书第三章关于ASP.NET运行原理讲述...

    软件测试面试题总结

    java程序员面试宝典、java程序员的基本修养、大话设计模式只看了重要的 )、测试相关(软件测试的艺术、从菜鸟到测试架构师、软件测试技术大全、selenium,qtp,junit的一些相关资料和书)、linux看了一点(鸟哥的...

    butte-java-note-编程文档

    编程文档【JVM、Java基础、设计模式、结构算法、架构设计、Spring框架、中间件、大数据、数据库、Linux、数据服务】

    超过1000本的计算机经典书籍、个人笔记资料以及本人在各平台发表文章中所涉及的资源等

    超过1000本的计算机经典书籍、个人笔记资料以及...书籍资源包括C/C++、Java、Python、Go语言、数据结构与算法、操作系统、后端架构、计算机系统知识、数据库、计算机网络、设计模式、前端、汇编以及校招社招各种面经~

    超过1000本的计算机经典书籍、个人笔记资料以及本人在各平台发表文章中所涉及的资源等 (2).zip

    书籍资源包括C/C++、Java、Python、Go语言、数据结构与算法、操作系统、后端架构、计算机系统知识、数据库、计算机网络、设计模式、前端、汇编以及校招社招各种面经~

    net学习笔记及其他代码应用

    3. 一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少, 用递归算法实现。 答:public class MainClass { public static void Main() { Console.WriteLine(Foo(30)); } public static ...

    matlab微分方程代码-notes:一个码农的毕生所学.考研,就业,上学.语言篇,Android,C++,Java,JavaScript,L

    设计模式 数据结构 数据库 算法 UML建模 Windows程序设计 数学篇 概率论与数理统计 微积分 线性代数 张量 机器学习篇 机器学习 pytorch sklearn TensorFlow 参考 欢迎个位,把那些占位符的地方补充完整。 仅供参考,...

    上海泛微Java笔试题-CS-Resources:计算机学习资源合集

    书籍资源包括C/C++、Java、Python、Go语言、数据结构与算法、操作系统、后端架构、计算机系统知识、数据库、计算机网络、设计模式、前端、汇编以及校招社招各种面经~ 码云地址: gitHub地址: 欢迎 star、fork,哈哈...

    java8集合源码分析-AndroidLearn:Android学习笔记

    java8 集合源码分析 Java 内存模型 并发/多线程 类加载 垃圾回收 Android UI 生命周期 ...ActivityManagerService ...设计模式 代理模式 装饰者模式 架构 MVVM 组件化 JavaScript Linux 版本控制 实战

    java8集合源码分析-notebook:学java

    java8 集合源码分析 目录 记录Java的学习轨迹. 工程化专题 设计模式 分布式架构 Java核心技术卷一 Spring (前四篇是学习笔记) Spring Boot 系列 面试相关 算法 资料

    高级java笔试题-xiongfan:xiongfan

    高级java笔试题 感谢大家的关注与支持,最近工作上比较忙,一直没有抽出时间来更新~ 8月份终于赶在最后几天把性能优化补全了,结构方面还会再优化...设计模式 Gradle 计算机网络基础 常见面试算法题 Java 知识点汇总

    java饿汉式的应用源码-Note-Android:Note-Android

    设计模式汇总 Gradle知识点汇总 计算机网络基础 常见面试算法题汇总 Contanct Me 如果觉得看起来比较麻烦,需要PDF版本,或是需要更多学习资料,都可以加上QQ群领取。祝愿每一位有追求的Android开发同胞都能进大厂拿...

    leetcode中国-Kunaly-Notes:刘老shi笔记,了无生趣的生活,偷偷学点东西

    JAVA架构师 :love_letter: 数据库 MySQL Oracle :laptop: Linux :artist_palette: 前端 前端基础知识 :open_book: 内功修炼 :grinning_face_with_big_eyes: 这里不知道写点什么。 算法 Algorithm :lemon: 本节的每个...

Global site tag (gtag.js) - Google Analytics