Java设计模式 —— 面向对象设计原则
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设计模式 —— 面向对象设计原则的更多相关文章
- Java设计模式学习——设计原则
第一章 设计原则 1.开闭原则 一个软件实体,像类,模块,函数应该对扩展开放,对修改关闭 在设计的时候,要时刻考虑,让这个类尽量的好,写好了就不要去修改.如果有新的需求来,在增加一个类就完事了,原来的 ...
- 设计模式——<面向对象设计原则以及23种设计模式分类>
一.面向对象八大设计原则: 1.依赖倒置原则(DIP) 高层模块(稳定)不应该依赖于低层模块(变化),二者都应该依赖于抽象(稳定) . 抽象(稳定)不应该依赖于实现细节(变化) ,实现细节应该依赖于抽 ...
- java设计模式和设计原则
一.创建型模式 1.抽象工厂模式(Abstract factory pattern): 提供一个接口, 用于创建相关或依赖对象的家族, 而不需要指定具体类.2.生成器模式(Builder patter ...
- Java程序员应该了解的10个面向对象设计原则
面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorat ...
- (转)Java程序员应该了解的10个面向对象设计原则
面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...
- Java程序员应当知道的10个面向对象设计原则
面向对象设计原则是OOPS编程的核心, 但我见过的大多数Java程序员热心于像Singleton (单例) . Decorator(装饰器).Observer(观察者) 等设计模式,而没有把足够多的注 ...
- [译]Java 程序员应该了解的 10 个面向对象设计原则
面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...
- 设计模式学习(二):面向对象设计原则与UML类图
一.UML类图和面向对象设计原则简介 在学习设计模式之前,需要找我一些预备知识,主要包括UML类图和面向对象设计原则. UML类图可用于描述每一个设计模式的结构以及对模式实例进行说明,而模式结构又是设 ...
- 【Java工程师之路】[1-2.2]Java10个面向对象设计原则
面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...
- 设计模式学习笔记(二):UML与面向对象设计原则
1 UML 1.1 UML UML(Unified Modeling Language)是统一建模语言,1997年11月UML1.1版本提交给OMG并正式通过,成为建模语言的个那个也标准.2003年6 ...
随机推荐
- webstrom破解
1.下载webstrom补丁 链接:https://pan.baidu.com/s/1I93J_JOlbZzkoqV4EsJlpQ 提取码:kopn (永久有效) 2.将补丁复 ...
- 关于nth-of-type的注意事项
普通使用 nth-of-type: <div class="box"> <div> 第一个元素 </div> <p>没有用的元素&l ...
- pintia 3-7-5 逆波兰表达式求值 (20 分)
3-7-5 逆波兰表达式求值 (20 分) 逆波兰表示法是一种将运算符(operator)写在操作数(operand)后面 的描述程序(算式)的方法.举个例子,我们平常用中缀表示法描述的算式(1 + ...
- 点击按钮触发div颜色改变的几种写法
目录 JavaScript 行内事件 onclick绑定 关于选取元素 关于改变颜色 addEventListener jQuery 获取元素 绑定事件 设置样式 css() 添加class Vue ...
- Float浮动、 CSS定位(position)
Float浮动. CSS定位(position)1.CSS定位机制(1)普通流(标准流)-默认状态,元素自动从左往右,从上往下的排列(2)浮动-会使元素向左或向右移动,只能左右,不能上下-浮动元素碰到 ...
- HOOK大法
// 请求头hook 测试网站同花顺 OK var header_old = window.XMLHttpRequest.prototype.setRequestHeader;window.XMLHt ...
- linux软件安装篇
nginx篇 第一件事情 cd /etc/yum.repo.d mv CentOS-Base.repo CentOS-Base.repo.bak wget -O CentOS-Base.repo ht ...
- .NET实验三
实验名称:实验三 Windows 应用程序开发 一. 实验目的 1. 掌握窗口控件的使用方法: 2. 掌握 Windows 的编程基础. 二. 实验要求 根据要求,编写 C#程序,并将程序代码和运 ...
- iframe页面加载完成为什么还是获取不到里面的dom
iframe页面加载完成为什么还是获取不到里面的dom? 因为Iframe是跨域,跨域的情况下是无法获取到iframe里面的DOM的,即使iframe加载完成,也无法获取到里面的DOM. 有什么方法获 ...
- Centos 7 .Net core后台守护进程Supervisor教程
ASP.NET Core应用程序发布linux在shell中运行是正常的.可一但shell关闭网站也就关闭了,所以要配置守护进程, 用的是Supervisor,本文主要记录配置的过程和过程遇到的问题 ...