java八股文面试[设计模式]——设计原则

六大设计原则主要是指:

单一职责原则(Single Responsibility Principle);

开闭原则(Open Closed Principle);

里氏替换原则(Liskov Substitution Principle);

迪米特法则(Law of Demeter),又叫“最少知道法则”;

接口隔离原则(Interface Segregation Principle);

依赖倒置原则(Dependence Inversion Principle)。

把这 6 个原则的首字母(里氏替换原则和迪米特法则的首字母重复,只取一个)联合起来就是:SOLID(稳定的),其代表的含义也就是把这 6 个原则结合使用的好处:建立稳定、灵活、健壮的设计。

1、单一职责原则

单一职责原则的定义描述非常简单,也不难理解。一个类只负责完成一个职责或者功能。也就是说在类的设计中 我们不要设计大而全的类,而是要设计粒度小、功能单一的类。

> 比如 我们设计一个类里面既包含了用户的一些操作,又包含了支付的一些操作,那这个类的职责就不够单一,应该将该类进行拆分,拆分成多个功能更加单一的,粒度更细的类.

2、开放封闭原则

定义:对扩展开放,对修改关闭

对扩展开放和对修改关闭表示当一个类或一个方法有新需求或者需求发生改变时应该采用扩展的方式而不应该采用修改原有逻辑的方式来实现。因为扩展了新的逻辑如果有问题只会影响新的业务,不会影响老业务;而如果采用修改的方式,很有可能就会影响到老业务受影响。

优点:

1. 新老逻辑解耦,需求发生改变不会影响老业务的逻辑
2. 改动成本最小,只需要追加新逻辑,不需要改的老逻辑
3. 提供代码的稳定性和可扩展性

3、里氏替换原则

要理解里氏替换原则,其实就是要理解两个问题:

* 什么是替换?
* 什么是与期望行为一致的替换(Robert Martin所说的“必须能够替换”)?

1 ) 什么是替换 ?

替换的前提是面向对象语言所支持的多态特性同一个行为具有多个不同表现形式或形态的能力。

> **以JDK的集合框架为例,**`List`接口的定义为有序集合,`List`接口有多个派生类,比如大家耳熟能详的 `ArrayList`, `LinkedList`。那当某个方法参数或变量是 `List`接口类型时,既可以是 `ArrayList`的实现, 也可以是 `LinkedList`的实现,这就是替换。

2 ) 什么是与期望行为一致的替换?

在不了解派生类的情况下,仅通过接口基类的方法,即可清楚的知道方法的行为,而不管哪种派生类的实现,都与接口或基类方法的期望行为一致。

> **不需要关心是哪个类对接口进行了实现,因为不管底层如何实现,最终的结果都会符合接口中关于方法的描述(也就是与接口中方法的期望行为一致).**
>
> **或者说接口或基类的方法是一种契约,使用方按照这个契约来使用,派生类也按照这个契约来实现。这就是与期望行为一致的替换。**

4、接口隔离原则

定义:要为各个类建立它们需要的专用接口,而不要试图去建立一个很庞大的接口所有依赖它的类去调用。

接口隔离原则与单一职责原则的区别

接口隔离原则和单一职责都是为了提高类的内聚性降低它们之间的耦合性,体现了封装的思想,但两者是不同的:

* 单一职责原则注重的是职责,而接口隔离原则注重的是对接口依赖的隔离
* 单一职责原则主要是约束类,它针对的是程序中的实现和细节;接口隔离原则主要约束接口,主要针对抽象和程序整体框架的构建。

5、依赖倒置原则

定义:依赖倒置原则(Dependence Inversion Principle,DIP)是指在设计代码架构时,高层模块不应该依赖于底层模块,二者都应该依赖于抽象抽象不应该依赖于细节,细节应该依赖于抽象。

依赖倒置原则是实现开闭原则的重要途径之一,它降低了客户与实现模块之间的耦合。

依赖倒置原则的好处:

* 减少类间的耦合性,提高系统的稳定性 . (根据类与类之间的耦合度从弱到强排列:依赖关系、关关系、聚合关系、组合关系、泛化关系和实现关系 )
* 降低并行开发引起的风险 (两个类之间有依赖关系,只要制定出两者之间的接口(或抽象类)就可以独立开发了)
* 提高代码的可读性和可维护性

6、迪米特法则

简单来说迪米特法则想要表达的思想就是:  **不该有直接依赖关系的类之间,不要有依赖;有依赖关系的类之间,尽量只依赖必要的接口。**

> **如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。**

**软件开发中我们要基于这六个原则,设计建立稳定、灵活、健壮的程序.**

总结六大设计原则

1. 单一职责原则:一个类或接口只承担一个职责。

2. 里氏替换原则:在继承类时,务必重写(override)父类中所有的方法,尤其需要注意父类的protected方法(它们往往是让你重写的),子类尽量不要暴露自己的public方法供外界调用。

3. 依赖倒置原则:高层模块不应该依赖于低层模块,而应该依赖于抽象。抽象不应依赖于细节,细节应依赖于抽象。

4. 接口隔离原则:不要对外暴露没有实际意义的接口。

5. 迪米特法则:尽量减少对象之间的交互,从而减小类之间的耦合。

6. 开闭原则:对软件实体的改动,最好用扩展而非修改的方式。

知识来源:马士兵教育

百度安全验证

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小田田_XOW

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值