设计模式第一天|了解设计模式、设计模式七大原则

文章目录

了解设计模式

概念

软件设计模式(Software Design Patten),又称设计模式,是一套被反复使用,多数人只晓的,经过分类编目的,代码设计经验的总结.它描述了在软件设计过程中一些不断重复的问题,以及该问题的解决方案.也就是说,它是解决特定问题的一系列套路,是前辈们的代码设计经验的总结,具有一定的普遍性,可以反复使用.其目的是为了提高代码的复用性,代码可读性以及代码的可靠性.

优点

  1. 可以提高程序员的思维能力、编程能力和设计能力。
  2. 使程序设计更加标准化、代码编制更加工程化,使软件开发效率大大提高,从而缩短软件的开发周期。
  3. 使设计的代码可重用性高、可读性强、可靠性高、灵活性好、可维护性强。

核心原则

  1. 找出应用可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起
  2. 针对接口编程,而不是针对实现编程
  3. 为了交互对象之间的松耦合设计而努力

设计模式七大原则

单一职责原则

定义

一个类,应当只有一个引起它变化的原因;

即一个类应该只有一个职责。

优点

  1. 唯有专注,才能保证对象的高内聚;
  2. 唯有单一,才能保证对象的细粒度。对象的高内聚与细粒度有利于对象的重用。
  3. 减少代码冗余

俗话说

老师就是用来教书的,学生就是来学习的,而不是边学习边打游戏.

里氏替换原则

定义

如果对一个类型为S的对象o1,都有类型为T的对象o2,使得以S定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有发生变化,那么类型T是类型S的子类型。

所有引用基类的地方必须能透明地使用其子类对象。**清晰明确地说明只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或异常,**使用者可能根本就不需要知道父类还是子类;但是反过来则不可以,有子类的地方,父类未必就能适应。

继承

里氏替换原则的重要使用方式就是继承

继承的优点:

  1. 代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性;
  2. 提高代码的可重用性;
  3. 提高代码的可扩展性;
  4. 提高产品或项目的开放性。

缺点:

  • 继承是入侵式的。只要继承,就必须拥有父类的所有属性和方法;
  • 降低代码的灵活性。子类必须拥有父类的属性和方法,使子类受到限制;
  • 增强了耦合性。当父类的常量、变量和方法修改时,必须考虑子类的修改,这种修改可能造成大片的代码需要重构。

作用

从整体上看,继承的"利"大于"弊",然而如何让继承中"利"的因素发挥最大作用,同时减少"弊"所带来的麻烦,这就需要引入"里氏替换原则"。

俗话说

尽量使用父类去创建子类,想找儿子的话,就先找爸爸

java 复制代码
List<String> res = new ArrayList<>();

依赖倒置原则

定义

高层模块不应该依赖底层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象.

原因

传统的过程性系统的设计办法倾向于高层次的模块依赖于低层次的模块;抽象层次依赖于具体层次。"倒置"原则将这个错误的依赖关系倒置了过来,

作用

  • 依赖导致原则可以降低类间的耦合性
  • 依赖倒置原则可以提高系统的稳定性
  • 依赖倒置则可以减少并行开发引起的风险
  • 依赖倒置原则可以提高代码的可读性和可维护性

重要性

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

核心思想

要面向接口编程,不要面向实现编程

俗话说

爹爹负责提出设想,让你去实现,要根据设想,去实现.

接口隔离原则

定义

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

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

具体含义

一个接口代表一个角色,不应当将不同的角色都交给一个接口。没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染。因此使用多个专门的接口比使用单一的总接口要好。

不应该强迫客户依赖于它们不用的方法。接口属于客户,不属于它所在的类层次结构,即不要强迫客户使用它们不用的方法,否则这些客户就会面临由于这些不使用的方法的改变所带来的改变。

俗话说

我要啥你给我啥就完了,比如说小孩是个角色,老人也是个角色,小孩(角色,接口)需要长高(接口方法),老人又不需要.

迪米特法则

定义

迪米特法则又叫最少知识原则,意思是一个对象应当对其他对象尽可能少的了解。

俗话说

我想租房子,没必要知道每个房东的信息,我只需要一个中介来给我介绍就完了,反过来也一样

开闭原则

定义

一个软件实体应当对扩展开放,对修改关闭。(扩展可以,修改不行)

在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展,即应当可以在不必修改源代码的情况下改变这个模块的行为。

重要性

是面对对象编程中最基础的原则,其他原则(单一职责、里氏替换、依赖倒置、接口隔离、迪米特法则)都是开闭原则的具体形态,

作用

  • 开闭原则提高复用性。
  • 开闭原则提高可维护性。
  • 开闭原则提高灵活性。
  • 开闭原则易于测试。

合成复用原则

定义

又叫组合/集合复用原则.它要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现.

重要性

  1. 继承复用的缺点

    继承复用破坏了类的封装性.因为继承会将父类的实现细节暴露给子类,父类对子类是透明的,所以这种复用又称为"白箱"复用 子类与父类的耦合度高.父类的实现的任何改变都会导致子类的实现发生变化,这不利于类的扩展与维护 它限制了复用的灵活性.从父类继承而来的实现是静态的,在编译时已经定义,所以在运行时不可能发生变化(说白了就是不符合开闭原则)

  2. 组合复用的优点

    它维持了类的封住性,因为成分对象的内部细节是新对象看不见的,所以这种复用又称为"黑箱"复用 新旧类之间的耦合度降低,这种复用所需要的的依赖较少,新对象存取成分对象的唯一方法是通过对成分对象的接口. 复用的灵活性高,这种复用可以再运行时动态进行,新对象可以动态地引用与成分对象类型相同的对象(符合开闭原则)

俗话说

儿子从父亲这继承来的,这个时候儿子想学点新东西,继承复用就是说让爹先学会,再给儿子教,合成复用就是说直接让儿子去找别人学,合成一下.直接让老爹学太为难老爹了

相关推荐
wrx繁星点点3 小时前
状态模式(State Pattern)详解
java·开发语言·ui·设计模式·状态模式
金池尽干5 小时前
设计模式之——观察者模式
观察者模式·设计模式
也无晴也无风雨5 小时前
代码中的设计模式-策略模式
设计模式·bash·策略模式
捕鲸叉14 小时前
MVC(Model-View-Controller)模式概述
开发语言·c++·设计模式
wrx繁星点点14 小时前
享元模式:高效管理共享对象的设计模式
java·开发语言·spring·设计模式·maven·intellij-idea·享元模式
凉辰14 小时前
设计模式 策略模式 场景Vue (技术提升)
vue.js·设计模式·策略模式
菜菜-plus14 小时前
java设计模式之策略模式
java·设计模式·策略模式
暗黑起源喵15 小时前
设计模式-迭代器
设计模式
lexusv8ls600h16 小时前
微服务设计模式 - 网关路由模式(Gateway Routing Pattern)
spring boot·微服务·设计模式
sniper_fandc19 小时前
抽象工厂模式
java·设计模式·抽象工厂模式