Java设计模式面试题 01 - 六大原则

1. 单一职责原则

  Single Responsibility Principle SRP原则

  分清职责,接口一定要做到单一职责,方法也要做到,类尽量做到

      定义单一职责原则指的是应该有且仅有一个原因引起类的变更

2. 里氏替换原则

  Liskov Substitution Principle LSP原则
  定义:所有引用基类的地方必须能透明地使用其子类的对象,通俗的来讲就是父类能出现的地方子类就可以出现,但是反过来就不行了。子类可以扩展父类的功能,但不能改变父类原有的功能。
     里氏替换原则为良好的继承定义了一个规范;
     在类中调用其他类时务必要使用父类或者接口,如果不能使用父类或者接口,则说明类的设计已经违背了LSP原则;
     我们在做系统设计时,经常会定义一个接口或者抽象类,然后编码实现,调用类则直接传入接口或者抽象类,不关心具体实现;
     如果子类不能完整地实现父类的方法,或者父类的某些方法在子类中已经发生“畸变”,则建议断开父子继承关系,采用依赖、聚集、组合等关系代替继承;
     在项目中采用里氏替换原则时,尽量避免子类的个性,一旦子类有个性这个子类和父类的关系就很难调和了。     
     定义包含四层意思:
          1) 子类可以实现父的抽象方法,但不能覆写父类的非抽象方法。 父类中凡是已经实现好的方法(相对于抽象方法而言),实际上是在设定一系列的规范和契约,虽然它不强制要求所有的子类必须遵从这些契约,但是如果子类对这些非抽象方法任意修改,就会对整个继承体系造成破坏。
          2) 子类中可以增加自己特有的方法。
          3) 覆写 或实现父类的方法时,输入参数可以被放大。(覆写指的覆写一个正常方法并重写,是实现指的是实现接口或者抽象方法)
          4) 覆写或实现父类的方法时输出结果可以被缩小(若放大,还能用子类替换父类吗?)

3. 依赖倒置原则

  Dependence Inversion Principle DIP原则

  定义:
          1)高层模块不应该依赖低层模块
          2)抽象不应该依赖细节
          3)细节依赖抽象
     在Java中的表现为:面向接口编程 OOP
          1)模块间的依赖通过抽象发生,实现类间不发生直接的依赖关系,其依赖关系通过接口或者抽象类产生;
          2)接口或抽象类不依赖于实现类
          3)实现类依赖于接口或者抽象类
      依赖倒置原则可以减少类之间的耦合性,提高系统的稳定性;降低并行开发引起的风险。
     要并行开发就要解决模块间的依赖关系,依赖倒置原则正好解决这个问题。
     在Java中,只要定义变量就必然要有类型,一个变量可以有两种类型,表面类型和实际类型,UserDao是表面类型,UserDaoImpl是实际类型。
       依赖的三种写法:依赖是可以传递的,只要做到抽象依赖,即使是多层的依赖也没关系。
          1)构造函数传递依赖对象
          2)Setter方法传递依赖对象
          3)接口方法中传入依赖对象
     最佳实践:
          1)每个类尽量都有接口或者抽象类
          2)变量的表面类型尽量是接口或者抽象类
          3)不从具体类派生类
          4)尽量不覆写基类的方法,只实现;
     倒置的概念就是所谓的抽象依赖。

4. 接口隔离原则

  Interface Segregation Principle ISP原则

  把一个臃肿的接口变更为两个独立的接口所依赖的原则就是接口隔离原则;

定义

客户端不应该依赖它不需要的接口

类间的依赖关系应该建立在最小的接口上;

根据接口隔离原则拆分接口时,首先必须满足单一职责原则;

接口要高内聚,高内聚就是提高接口、类、模块的处理能力,减少对外交互。

定制服务,为不同的用户定制不同的服务

接口设计要适度,各方都要照顾。

接口和类尽量使用院子接口或原子类来组装,但是这个原子接口或原子类该怎么组装,是一个难题。在实践中可根据以下标准来衡量:

1)一个接口只服务于一个字模块或业务逻辑

2)通过业务逻辑压缩接口中的public方法

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

4)了解业务背景,避免生搬硬套模式。

开发中只能根据,经验和常识来判断接口粒度的大小。

5. 迪米特法则

  Law of Demter LoD

   也称为最少知识原则:Least Knowledge Principle LKP
     描述的是,一个对象应该对其他对象有最少的了解,一个类只需要知道自己需要耦合或者调用类的public方法即可。
     尽量保证风险的不扩散,修改的地方越少,代码就越好。
     一个类公开的public方法越多,修改时涉及的面也越大,变更的风险也越大。
     只和朋友交流:
     朋友类的定义:出现在成员变量、方法的输入输出参数中的类称为成员朋友类,而出现在方法体内部的类不属于朋友类,迪米特法则告诉我们,一个类      只和他的朋友类做交流,老师和体育委员交流、体育委员和学生交流。
     在实际中如果遇到,一个方法放在本类中也可以,放在其他类中也合适,那么你可以坚持这样一个原则:如果一个方法放在本类中,既不增加类间关系,也    对本类不产生负面影响,那就放置在本类中。
     迪米特法则的核心观念就是类间的解耦,弱耦合。但是也要衡量,既要让结构清晰,又要高内聚低耦合。
     我们在使用原则时,要反复衡量。

6. 开闭原则

  Java世界里最基础的设计原则
     定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
     根据3W原则介绍
     什么是开闭原则?
          软件实体包括:项目或者软件产品中按照一定的逻辑规则划分的模块。
                                 抽象和类
                                 方法
          一个软件产品在开发周期内,肯定会有变化,我们的设计应该尽量适应这些变化,开闭原则则告诉我们尽量通过扩展软件实体的行为来实现变化,而不是修改已有的代码来完成变化。
     为什么使用开闭原则? -- 重要性
          前五章介绍的原则都是开闭原则的具体形态,开闭原则是精神领袖。
          对测试的影响
          可提高复用性
          可提高可维护性
          面向对象开发的要求
    如何使用开闭原则?
          开闭原则是非常虚的一个原则;
          抽象约束、元数据控制模块行为、制定项目章程、封装变化;
          封装变化有两层含义,第一将相同的变化封装到一个接口或抽象类中;第二,将不同的变化封装到不同的接口或抽象类中。23种设计模式都是从各个不同的角度对变化进行封装的;

总结:

Single Responsibility Principle
Open Closed Principle
Liskov Substitution Principle
Law of Demeter
Interface Segregation Principle
Dependence Inversion Principle
这六个字母联合起来 Solid 稳定的;
 
 
笔记来源---设计模式之禅(秦小波著)
 
 
 

Java设计模式面试题 01 - 六大原则的更多相关文章

  1. java设计模式(2)---六大原则

    设计模式之六大原则 这篇博客非常有意义,希望自己能够理解的基础上,在实际开发中融入这些思想,运用里面的精髓. 先列出六大原则:单一职责原则.里氏替换原则.接口隔离原则.依赖倒置原则.迪米特原则.开闭原 ...

  2. java设计模式学习笔记--接口隔离原则

    接口隔离原则简述 客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应建立在最小的接口上 应用场景 如下UML图 类A通过接口Interface1依赖类B,类C通过接口Interface1依赖类 ...

  3. java设计模式学习笔记--单一职责原则

    单一职责原则注意事项和细节 1.降低类的复杂度,一个类只负责一项职责 2.提高可读性,可维护性 3.降低变更引起的风险 4.通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单 ...

  4. JavaScript设计模式经典-面向对象中六大原则

    作者 | Jeskson来源 | 达达前端小酒馆 1 主要学习JavaScript中的六大原则.那么六大原则还记得是什么了吗?六大原则指:单一职责原则(SRP),开放封闭原则(OCP),里氏替换原则( ...

  5. Java设计模式的7种设计原则还有很多人不知道

    前言 其实没有设计模式我们也能完成开发工作.但是为什么需要设计模式呢?让你看起来很牛,没错这个算一个.让你的代码层次感分明,可读性强而且容易维护.让你像我一样有更多的摸鱼划水时间. 可能有人说我一个类 ...

  6. java设计模式学习笔记--开闭原则

    基本介绍 1.开闭(ocp)原则时编程中最基础.最重要的设计原则 2.一个软件实体如类.木块和函数应该对扩展开放,对修改关闭.用抽象构建框架,用实现扩展细节.即对提供方开放,对使用方关闭. 3.当软件 ...

  7. java设计模式学习笔记--依赖倒转原则

    依赖倒转原则简述 1.高层模块不应该依赖低层模块,二者都应该依赖其抽象 2.抽象不应该依赖细节,细节应该依赖抽象 3.依赖倒转得中心思想时面向接口编程 4.依赖倒转原则时基于这样得设计理念:相对于细节 ...

  8. java设计模式学习笔记——里氏替换原则

    oo中的继承性的思考和说明 1.继承包含这样一层含义:父类中凡是已经实现好的方法,实际上是在设定规范和契约,虽然它不强制要求所有的子类必须遵循这些七月,但是如果子类对这些已经实现的方法任意修改,就会对 ...

  9. java设计模式学习笔记--浅谈设计模式

    设计模式的目的 编写软件的过程中,程序员面临着来自耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性等多方面的挑战.设计模式为了让程序具有更好的 1.代码重用性(即:相同功能的代码,不用多次编写) ...

随机推荐

  1. 字符串查找算法总结(暴力匹配、KMP 算法、Boyer-Moore 算法和 Sunday 算法)

    字符串匹配是字符串的一种基本操作:给定一个长度为 M 的文本和一个长度为 N 的模式串,在文本中找到一个和该模式相符的子字符串,并返回该字字符串在文本中的位置. KMP 算法,全称是 Knuth-Mo ...

  2. Django的URL路由

    URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那 ...

  3. 解决新建maven项目速度慢的问题

    问题描述 通过idea新建maven项目,参数设置好后,idea自动构建maven项目时,速度很慢. 参数设置如图: 执行时间如下图: Total time为8:49,花了将近十分钟时间. 连续尝试了 ...

  4. XCel 项目总结 - Electron 与 Vue 的性能优化

    XCEL 是由凹凸实验室推出的一个 Excel 数据清洗工具,其通过可视化的方式让用户轻松地对 Excel 数据进行筛选. XCEL 基于 Electron 和 Vue 2.0 进行开发,充分利用 E ...

  5. bash之重定向

                                                                          标准输入 stdin:代码为0,使用< 或 <& ...

  6. Asp.Net 常用工具类之Office—Excel导入(5)

    之前在做一个项目的时候,客户方面只提供了一份简单的Excel文件,且要跟现有数据进行对接. 当时想到的是如果数据量不大,可以Excel一条一条加进去,无奈数据有几十兆!!! 换了一种思维,进行了导入: ...

  7. express 4

    http://www.expressjs.com.cn/4x/api.html#app中间件 路由 模板 跨域 json cookie session

  8. 基于 Koa平台Node.js开发的KoaHub.js的输出json到页面代码

    koahub-body-res koahub body res Format koa's respond json. Installation $ npm install koahub-body-re ...

  9. C风格字符串和C++ string 对象赋值操作的性能比较

    <<C++ Primer>> 第四版 Exercise Section 4.3.1 部分Exercise 4.2.9 习题如下: 在自己本机执行如下程序,记录程序执行时间: # ...

  10. IIS HTTP 错误 500.19 - Internal Server Error HTTP 错误 401.3 - Unauthorized 解决办法

    前言:IIS是一个强大的服务器管理器,当遇到 IIS HTTP 错误 500.19 - Internal Server Error  HTTP 错误 401.3 - Unauthorized 的解决办 ...