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. tornado学习 - TCPClient 实现聊天功能

    之前完成了一个简单的聊天服务器,连接服务器使用的是系统自带nc命令,接下来就是通过自己实现TCPClient. 客户端与服务器功能大致相仿,相对与服务器只是少了转发消息环节. 首先,定义TCPClie ...

  2. web及H5 的链接测试

    1:先下载一个Xenu工具 2:安装完成之后,进入页面(将弹出框关闭) 3:进行设置(一般不用修改设置) 4:修改完成之后点击工具栏中的file按钮,并输入想要测试的URL地址 5:点击OK测试完成之 ...

  3. 来自高维的对抗 - 逆向TinyTool自制

    一.序 无论是逆向分析还是漏洞利用,我所理解的攻防博弈无非是二者在既定的某一阶段,以高维的方式进行对抗,并不断地升级维度.比如,逆向工程人员一般会选择在Root的环境下对App进行调试分析,其是以ro ...

  4. ARP攻击

    ARP攻击,是针对以太网地址解析协议(ARP)的一种攻击技术,就是通过伪造IP地址和MAC地址实现ARP欺骗,能够在网络中产生大量的ARP通信量使网络阻塞.此种攻击可让攻击者取得局域网上的数据封包甚至 ...

  5. 用友财务软件U8V10.1虚拟机 及培训视频

    需要学习用友财务软件U8V10.1虚拟机 及培训视频 ,请联系QQ:858-048-581 虚拟机系统为WIN2003+SQLSERVER2008+U8V10.1,虚拟机内存最少需要2G

  6. 电器ERP行业案例——环力科技

    环力科技ERP案例 企业简介 [规模] 环力公司始建于1992年,是一家专业生产电子压力控制器.水泵压力控制器.气泵压力控制器.电泵浮球控制器.全自动水泵及其它配套产品研究.开发.生产.销售为一体的专 ...

  7. 算法笔记_066:Kruskal算法详解(Java)

    目录 1 问题描述 2 解决方案 2.1 构造最小生成树示例 2.2 伪码及时间效率分析 2.3 具体编码(最佳时间效率)   1 问题描述 何为Kruskal算法? 该算法功能:求取加权连通图的最小 ...

  8. 实战Tomcat配置SSL,使用openssl制作证书

    制作证书以及Tomcat配置 搭建openssl环境,下载openssl并设置环境变量方便命令行的使用: 修改openssl配置文件,设置dir目录,如设置dir=e:/temp/openssl_ca ...

  9. SqlServer建立存储过程,方便.NET插入自增字段

    首先,需要在数据库中创建一个表,以在test数据库创建tableNo表为例: create table tablesNo ( tableName ) not null, --表名 num int no ...

  10. spl之文件处理

    spl是php标准库的缩写 spl文件处理类库: SplFileInfo  //是一个类用以获取文件的各种信息SplFileInfo的所有方法如下 方法名            - ---   说明2 ...