设计模式之七大设计原则详解

2022-10-04 14:29:44

七大设计原则:

七大设计原则:开闭原则、依赖倒置原则、单一职责原则、接口隔离原则、迪米特原则、里氏替换原则、合成复用原则

Java 有三大特性:封装、继承、多态。

而这七大设计原则,更像是对三大特性的一种体现。

七大原则并不是分别独立的原则,他们之间是相互有联系的,甚至可以看做是一体的。

有时候你为了符合某种原则会无意之间破坏另一个原则

有时候你为了符合某种原则还会发现这也符合另外几种原则

开闭原则

对(类、方法)扩展开放,对修改关闭。

开闭原则是七大设计原则中最基础的一个。

我觉得开闭很好理解,但是对扩展修改 这两个动作的定义就看自己的经验了。

在开发的过程汇总,对经常需要变动(修改)的地方,通过扩展(抽象)的方式来达到目的。可以使用继承、接口、抽象类这些方式。

依赖倒置原则

依赖倒置原则更加体验在代码结构层面

高层模块不应该依赖低层模块,都应该依赖其抽象。该原则规定了高层模块应如何调用底层模块。

开车,就把车抽象(可能开不同的车)。

开车这个类只需要依赖一个车的抽象类,而不是去依赖一堆各式各样的车。这个地方编码的时候也符合了开闭原则,车是经常变化的,那就把车抽象化。

吃饭,就把饭抽象(可能每次吃的饭也不同)

单一职责原则

一个类,接口,方法 只负责一项职责

这样的涉设计可以提高代码的可读性,降低代类的复杂度,最主要的是降低了每次变更引起的风险。

主要是避免修改方法之后,对多处调用的地方产生影响。

接口隔离原则

高类聚,低耦合

主要体现在接口规划方面,其实就是更加细化接口,实现的时候只实现自己需要的接口。

万事万物都有一个度,具体细化到什么程度,这个就看实际情况。其实很多时候我们不一定需要特别细化。

比如:动物的行走方式,每个动物都不一样,有的是用翅膀飞,有的是用腿跑,还有的是在水里游。

虽然每个方式都不一样,但是他们又都是同一种行为(行动方式)。

在设计接口时,自己要知道是不是需要根据不同的行为类型分别定义不同的行为接口。

迪米特原则

最少知道原则,只和朋友交流,不和陌生人说话

和自己没有直接关联的类,不要引用。

迪米特原则更加像是描述了同一层模块之间的相互调用规则。

里氏替换原则

子类对象无论何时都能替换父类对象

子类可以扩展父类的功能,但不能改变父类原有的功能。

里氏替换原则是描述了父子类之间继承的规则。

组合复用原则

尽量使用对象组合、聚合,而不是继承关系达到软件复用的目的

继承、关联、聚合、组合的区别:

1、继承

不用多说了,A继承B,那么A就是B,但反过来B不一定是A。所以继承是is-a的关系,是一种纵向的关系。

2、关联

关联是两个类之间有联系,这种联系是很微弱的或者说是临时的,比如人过河要坐船,人和船就产生了联系,但是这种联系是临时的,人过了河就跟船没关系了。表现在代码层面就是A关联B,那么B以A的成员变量的形式存在在类A中。

3、聚合

聚合是关联关系的一种,也是两个事物要产生关系,但是这个关系的强度要大于关联关系,不是微弱或者临时的,是比较长久的关联,比如员工和公司的关系。但是这种互相关联的两个对象彼此又是独立的,各有各的生命周期,如果拆散这种关系那么各自也能玩儿的转。就好比员工和公司是一种长期的关系,但是公司和员工是彼此独立的,各有各的生命周期,公司没有张三这个员工也能玩儿的转,反过来张三不在这个公司去别的公司也玩儿的转。这种关系体现的是has-a的关系,代码表现和关联关系一样。

4、组合

组合是比聚合更紧密的关联关系,是一种强关联关系,具有组合关系的两个事物谁都不能缺少谁,如果断开这种关系各自都玩儿不转了,比如人和大脑的关系。这中关系是contains-a的关系,代码表现和关联关系一样。

所以从代码层面上看关联、聚合和组合表现形式都是一样的,得从语义上来区分,他们三个都是横向的关系。

那什么时候用继承又什么时候用组合呢?如果你要对现实世界建模,比如要描述狗类和动物的时候就要用继承,因为这些在概念上具有层次关系;如果你想表述你个实体要借助另一个实体来完成某项任务或者想表达has-a或者contains-a的时候就要用组合;如果只是在实现层面想达到代码复用的目的,那么优先使用组合。

  • 作者:carl的分享笔记
  • 原文链接:https://blog.csdn.net/aaa31203/article/details/119859798
    更新时间:2022-10-04 14:29:44