1 设计模式概述

1.1 设计模式的定义与分类

设计模式的定义

Design patterns are descriptions of communicating objects and classes that are customized to solve a general design problem in a particular context.

翻译过来就是:设计模式是在特定环境下为了解决某一通用软件设计问题提供的一套定制的解决方案,该方案描述了对象和类之间的相互作用。

它是一套被反复使用的代码设计经验总结,使用设计模式的目的是代码可重用,让代码更容易被他人理解并提高代码的可靠性。

1.2 设计模式的分类

1.2.1 根据目的分类

  • 创建型模式:主要用于创建对象,包括工厂模式抽象工厂模式,建造者模式,原型模式和单例模式
  • 结构型模式:主要用于处理类或对象的组合,包括适配器模式,桥接模式,组合模式,装饰模式,外观模式,享元模式和代理模式
  • 行为型模式:主要用于描述类或对象怎样交互和分配职责,包括职责链模式,命令模式,解释器模式,迭代器模式,中介者模式,备忘录模式,观察者模式,状态模式,策略模式,模板方法模式访问者模式

1.2.2 根据范围分类

  • 类模式:处理类和子类之间的关系,这些关系通过继承建立,在编译时就被确定,属于静态关系。
  • 对象模式:处理对象间的关系,这些关系在运行时变化,具有动态性。

1.3 设计模式的优点

设计模式是从许多优秀的软件系统中总结出的成功的、能够实现可维护性复用的设计方案,使用这些方案可以避免做一些重复性的工作,而且可以设计出高质量的软件系统。

2 面向对象设计原则

2.1 面向对象设计原则概述

软件的可维护性和可复用性是两个非常重要的软件质量衡量属性。可维护性指的是软件能够被理解、改正、适应及扩展的难易程度,可复用性是指软件能够被重复使用的难易程度。

面向对象设计的目标之一在于支持可维护性复用,一方面需要实现源代码的复用,另一方面要确保系统能够易于扩展和修改。面向对象设计原则为支持可维护性复用而诞生,这些原则蕴含在很多设计模式之中。

2.2 单一职责原则

Single Responsibility Principle: Every object should have a single responsibility, and that responsibility should be entirely encapsulated by the class.

翻译过来就是:一个对象应该只包含单一的职责,并且该职责被完整的封装在一个类中。

单一职责原则用于控制类的粒度大小,它还有另一种定义方式:就一个类而言,应该只有一个引起它变化的原因。

单一职责原则是实现高内聚,低耦合的指导原则,需要发现类的不同职责并将其分离。

2.3 开闭原则

Open-Closed Principle: Software entities should be open for extension, but closed for modification.

翻译过来就是:软件实体应该对扩展开放,对修改关闭。

软件实体可以是一个软件模块,一个由多个类组成的局部结构或者一个独立的类,开闭原则就是指软件实体应该尽量在不修改原有代码的情况下进行扩展。

2.4 里氏代换原则

Liskov Substitution Principle: Functions that use pointers or references to base classes must be able to use objects of derived classes without knowong it.

翻译过来就是:所有引用基类的地方必须能透明地使用其子类的对象。

里氏代换原则表明,在软件中将一个基类对象替换成它的子类对象,程序将被不会产生任何错误和异常,反过来则不成立。

里氏代换原则是实现开闭原则的重要方式之一,由于在使用基类的地方都能使用子类对象,因此在程序中应尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。

2.5 依赖倒转原则

Dependence Inversion Principle: High level modules should not depend upon low level modules, both should depend upon abstractions. Abstractions should not depend upon details, details should depend upon abstractions.

翻译过来就是:高层模块不应该依赖低层模块,它们都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。

依赖倒转原则要求针对接口编程,不要针对实现编程。

依赖倒转原则要求在程序代码中传递参数或者关联对象尽量引用层次高的抽象层,即使用接口或者抽象类进行变量类型声明、参数类型声明、方法返回类型声明等,而不用具体类。为了确保依赖倒转原则的应用,一个具体类应该只实现接口或抽象类中声明过的方法,而不用给出多余的方法,否则将无法调用在子类中增加的新方法

在实现依赖倒转原则时需要针对抽象层编程,而将具体类的对象通过依赖注入的方式注入到其他对象中。常用的注入方式有3种,构造注入、设值注入和接口注入。

  • 构造注入:通过构造函数传入具体类的对象
  • 设值注入:通过 Setter 方法传入具体类的对象
  • 接口注入:通过在接口中声明的业务方法传入具体类的对象

这些方法在定义时使用的是抽象类型,在运行时再传入具体类型的对象,由子类对象来覆盖父类对象。

2.6 接口隔离原则

Interface Segregation Principle: Clients should not be forced to depend upon interfaces that they do not use.

翻译过来就是:客户端不应该依赖那些它不需要的接口。

根据接口隔离原则,当一个大接口太大时需要将它分割成一些更细小的接口,使用该接口的客户端只需知道与之相关的方法即可。

在面向对象编程语言中,实现一个接口需要实现该接口中定义的所有方法,因此大的接口使用起来不一定方便,为了使接口的职责单一,需要将大接口中的方法根据其职责不同分别放在不同的小接口中,以确保每个接口使用起来都较为方便,并承担某一单一角色。

2.7 合成复用原则

Compsite Reuse Principle: Favor composition of objects over inheritance as a reuse mechanism.

翻译过来就是:优先使用对象组合,而不是通过继承来达到复用的目的。

合成复用原则就是在一个新对象里通过关联关系(组合/聚合)来使用一些已有的对象,使之成为新对象的一部分,新对象通过委派调用已有对象的方法来达到复用功能的目的。即在复用时尽量使用组合/聚合关系,少用继承。

在面向对象设计中可以通过两种方法复用已有的设计和实现,即组合/聚合关系或继承。但首先应该考虑使用组合/聚合关系,将已有的对象纳入到新对象中,使之成为新对象的一部分,因此新对象可以调用已有对象的功能,且可以保持已有对象的内部实现细节对于新对象不可见,使系统更加灵活,降低类与类之间的耦合度。

通过继承来复用的主要问题是会破坏系统的封装性,因为继承会将基类的实现细节暴露给子类,而且如果基类发生改变,子类的实现也不得不发生改变;从基类继承而来的实现是静态的,不能在运行时发生改变,没有足够的灵活性。

2.8 迪米特法则

Law of Demeter: Each unit should have only limited knowledge about other units: only units "closely" related to the current unit.

翻译过来就是:每一个软件单元对其他单元都只有最少的信息,而且局限于那些与本单元密切相关的软件单元。

迪米特法则要求一个软件实体应该尽可能少地与其他实体发生相互作用。如果一个系统符合迪米特法则,那么当其中某一个模块发生变化时就会尽量少的影响其他模块,扩展会相对容易。应用迪米特法则可降低系统的耦合度,使类和类之间保持松散的关系。

在迪米特法则中,与本单元密切相关的单元括以下几类:

  • 当前对象本身
  • 以参数形式传入当前对象方法中的其他对象
  • 当前对象的成员对象
  • 当前对象所创建的对象

Java设计模式 —— 面向对象设计原则的更多相关文章

  1. Java设计模式学习——设计原则

    第一章 设计原则 1.开闭原则 一个软件实体,像类,模块,函数应该对扩展开放,对修改关闭 在设计的时候,要时刻考虑,让这个类尽量的好,写好了就不要去修改.如果有新的需求来,在增加一个类就完事了,原来的 ...

  2. 设计模式——<面向对象设计原则以及23种设计模式分类>

    一.面向对象八大设计原则: 1.依赖倒置原则(DIP) 高层模块(稳定)不应该依赖于低层模块(变化),二者都应该依赖于抽象(稳定) . 抽象(稳定)不应该依赖于实现细节(变化) ,实现细节应该依赖于抽 ...

  3. java设计模式和设计原则

    一.创建型模式 1.抽象工厂模式(Abstract factory pattern): 提供一个接口, 用于创建相关或依赖对象的家族, 而不需要指定具体类.2.生成器模式(Builder patter ...

  4. Java程序员应该了解的10个面向对象设计原则

    面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorat ...

  5. (转)Java程序员应该了解的10个面向对象设计原则

    面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...

  6. Java程序员应当知道的10个面向对象设计原则

    面向对象设计原则是OOPS编程的核心, 但我见过的大多数Java程序员热心于像Singleton (单例) . Decorator(装饰器).Observer(观察者) 等设计模式,而没有把足够多的注 ...

  7. [译]Java 程序员应该了解的 10 个面向对象设计原则

    面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...

  8. 设计模式学习(二):面向对象设计原则与UML类图

    一.UML类图和面向对象设计原则简介 在学习设计模式之前,需要找我一些预备知识,主要包括UML类图和面向对象设计原则. UML类图可用于描述每一个设计模式的结构以及对模式实例进行说明,而模式结构又是设 ...

  9. 【Java工程师之路】[1-2.2]Java10个面向对象设计原则

    面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...

  10. 设计模式学习笔记(二):UML与面向对象设计原则

    1 UML 1.1 UML UML(Unified Modeling Language)是统一建模语言,1997年11月UML1.1版本提交给OMG并正式通过,成为建模语言的个那个也标准.2003年6 ...

随机推荐

  1. jsp第十周

    数据库test 中建个表 stu(stuid 主键 自动增长 ,用户名,密码,年龄) 1.设计一个注册页面,实现用户注册功能2.设计一个登陆页面,实现用户名密码登陆3.两个页面可以互相超链接 Base ...

  2. eclipse静态资源保存不重启(热部署静态资源/html)

    简单的来说就是windows->Prefrence->搜索 build automatically 并勾选就可以 不同的版本设置选项可能略微不同,其实比较简单但是新手可能不好找,所以帮到的 ...

  3. 2003031118—李伟—Python数据分析第七周作业—MySQL的安装以及使用

    项目    MySQL的安装以及使用 课程班级博客链接 20级数据班(本) 这个作业要求链接 作业要求 博客名称 2003031118-李伟-Python数据分析第七周作业-MySQL的安装以及使用 ...

  4. 关于VScode里TS文件内引入插件没有提示内置属性和方法这件事

    前几天使用VScode + Vue + Vite + Ts开发项目 由于自己手残 把VScode设置文件的代码做了一些修改 导致TS文件引入的插件没有提示了!! 几经折腾下 终于靠自己解决了! 不多说 ...

  5. KMP算法学习记录

    Foreword: 初学KMP匹配算法,不得其门,总感觉自己想,想不出来,看书上文字解释晦涩难懂.不能准确的捕捉算法设计时候的灵光和思路 .于是自己试着完成了一遍,现将过程记录下来,以供复习. Con ...

  6. 杨辉三角形实现过程详解-C语言基础

    这一篇要探讨的是"杨辉三角形的实现以及如何人工走循环".涉及的知识点和内容很少,主要是想说明如何看懂循环,如何跟着循环走.属于C语言基础篇. 学习编程的人,在学习的初期,几乎都会接 ...

  7. idea中新建java类

    project是项目,一个大目录,里面可以放多个module project里面存放: .idea文件(project相当于workplace) module(模块) out(编译生成的.class文 ...

  8. python全局变量和局部变量的关系

    今天看了一个全局变量,有点懵不知道全局变量是什么.然后就开始查找相关的资料 总结就一句话:你到哪里都是大爷,就是这么吊 有全局变量那么也有局部变量,同时也用一句话概括:外面怂成孙子,家里横成老子 接下 ...

  9. .Net5.0 上传图片、文件到服务器

    今天来看看.net上传图片到服务器的方式 public class ControlPresetUploadInput { /// <summary> /// 通道编号 /// </s ...

  10. Linux shell字符操作总结

    各符号介绍 字符串长度统计 ${#string}: 字符串string的长度 字符串截取 ${string#*substring}: 从左到右截取特定字符substring第一次出现位置之后的字符串 ...