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

时间:2022-09-04 23:07:50

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. 运用String类实现一个模拟用户登录程序

    package Test; import java.util.Scanner; // 模拟用户登录程序 // 思路: // 1.用两个String类分别接收用户名和密码 // 2.判断输入的用户名和密 ...

  2. C#获取执行存储过程的" 返回值"代码

    以下是C#代码: /// <summary> /// 执行存储过程,返回" 返回值" /// </summary> /// <param name=& ...

  3. 52-which 显示系统命令所在目录

    显示系统命令所在目录 which command-list 参数 command-list 是which搜索的一条或多条命令(实用程序) 示例 which 单条命令 $ which ls /bin/l ...

  4. MySQL-负载很高排查思路

    工欲善其事必先利其器,我说一下思路 思路:1.确定高负载的类型 htop,dstat命令看负载高是CPU还是IO2.监控具体的sql语句,是insert update 还是 delete导致高负载3. ...

  5. SRM 449 div1 &lpar;practice&rpar;

    250pt: 暴力枚举所有的可能的情况就好了,求面积的时候我是用梯形的面积减去两个三角形的面积.. 550pt: 题意:给你一个蜂窝形状的特殊图形,有一些格子已经被占据了,问你将剩下的格子用1*2的砖 ...

  6. 巧用hidden传递参数

  7. shell中对于命令的搜寻顺序

    当你在shell命令行输入一条命令时,shell的搜寻顺序是如何的呢?当你的脚本名字和shell中的函数名字重名,shell是如何决定运行哪一个的? 在shell中,shell对于命令的搜寻优先级为: ...

  8. VC&plus;&plus;&colon;创建,调用Win32动态链接库

    VC++:创建,调用Win32动态链接库 概述 DLL(Dynamic Linkable Library)动态链接库,Dll可以看作一种仓库,仓库中包含了可以直接使用的变量,函数或类.仓库的发展史经历 ...

  9. 整理C&plus;&plus;面试题for非CS程序猿——更新至【48】

    结合网上的C++面试题+自己的面经,进行整理记录,for我这种非CS的程序猿.(不定期更新,加入了自己的理解,如有不对,请指出) [1] new/delete和malloc/free的区别和联系? 1 ...

  10. go语言基础知识笔记(二)之数组和切片

    数组和切片知识用的也是比较多,的给我们工作带来很大的便利 (一) 数组 定义:在golang中数组的长度是不可变,数组存放要求是同一种数据类型 //golang中数组定义的四种方法1.先声明,后赋值 ...