初探设计模式6:面向对象7大设计原则及实例

简介: 开闭原则(Open-Closed Principle,OCP) 开闭原则是这七大设计原则中最常见、最基本的 开闭原则定义:软件实体对扩展是开放的,但对修改是关闭的。

开闭原则(Open-Closed Principle,OCP)

开闭原则是这七大设计原则中最常见、最基本的

开闭原则定义:软件实体对扩展是开放的,但对修改是关闭的。意思就是说在不修改软件实体的基础上去扩展其他功能。

开闭原则实例:

比如实现一个绘制图线的功能

设计方案如下图所示

用户类中直接调用画直线类,但是如果有一个新需求,要求我们画斜线或者曲线的话,这时就需要修改画直线类中的代码(使用switch,else if),这样就违背了开闭原则,于是我需要在不修改实体的基础上去扩展画斜线和曲线功能

重构后的代码设计方案如下图所示

这样我们在没有改动代码的情况下,而是添加代码的情况下完成功能扩展

 

单一职责原则(Simple Responsibility Principle,SRP)

如果一个类具有多个职责,应该把这多个职责分离出去,再分别创建一些类去一一完成这些职责

换句话说就是一个类的职责要单一,不能将太多的职责放在一个类中

单一职责核心:高内聚、低耦合

如下图是一个类画线的实现:

但是功能太过集中,严重违背了单一职责原则,重构后如下图所示

 

里氏替换原则(Liskov  Substitution Principle,LSP)

 

是继承复用的基石,说白了就是继承与派生的规则

里氏替换原则核心:在软件系统中,一个可以接受父类对象的地方必然可以接受子类对象

里氏替换原则实例:某系统需要实现画直线功能,现在有DrawLineA和DrawLineB两种画图方式,在操作类中提供了这两种画图方法选择画直线

 

现在我需要改变或添加一种画直线方式来画直线,比如原先使用DrawLineA方式进行画直线现在更换为DrawLineB方式来画直线,如果直接修改操作类的代码就违背了开闭原则。现在使用里氏替换原则重构代码,既可以方便了系统扩展,又遵循了开闭原则

重构后的方案图如下图所示

所以说里氏替换原则是实现开闭原则的重要方法之一

 

 

依赖倒置原则(Dependence Inversion Principle,DIP)

 

依赖倒置也叫依赖注入、依赖倒转

要针对抽象层编程,不要针对具体类编程

依赖倒置原则核心:要依赖于抽象,不要依赖于具体的实现。

分开来说:(注:抽象:接口或抽象类;细节:具体实现;如果把模块层次关系比作基础关系的话:高层模块和底层模块对应于父类和子类)

一、高层模块不应该依赖底层模块,这两者应该依赖与其抽象 

二、抽想不应该依赖细节

三、细节应依赖抽象

依赖倒置实例:

比如某系统可以从本地获取和服务器获取数据,后将数据可以为转化配置成XML文件和XLS文件

 

假设我们增加了数据源或者有新的转化格式,需要修改操作类里面的源代码,这样就违背了开闭原则

现在使用依赖倒置原则对其进行重构

重构方案图如下图所示

实例解析OOP程序设计七大设计原则(二)

接口隔离原则(Interface Segregation Principle,ISP)

使用多个专门接口来取代一个统一的接口,

一个接口不需要提供太多的行为,一个接口应该只提供一种对外的功能,不应该把所有的操作都封装到一个接口中。

接口隔离原则核心:不应该强迫客户端程序依赖他们 不需要的使用方法

接口隔离原则实例:

比如一个系统中有一个大的接口,这个接口包含了GameobjectA、GameobjecB、GameobjectC三个对象的接口

但是这三个对象中有些接口未必需要实现,现在使用接口隔离原则将接口隔离,这样又满足单一职责原则

重新构造的方案如下图所示

 

迪米特原则(Law of Demeter,LOD)

又叫做最少知识原则,一个软件实体对其他实体的引用越少越好,或者说如果两个类不必直接通信,那么这两个类就不应当发生直接的相互作用,而是通过一个第三者发生间接性的交互。

迪米特原则核心:高内聚,低耦合

低迷特原理实例:

比如某一系统有多个系统和多个数据源,他们之间的联系图如下:

这样比较杂乱,耦合性较高,使用迪米特原则后的构造方案如下图所示:

迪米特原则缺点:

一、降低模块间的通信效率

二、在系统的各个角落散落大量的小方法

 

合成复用原则(Composite Reuse Principle,CRP)

 

在面向对象设计中,可以通过两种基本方法在不同的环境中复用已有的设计和实现,即通过组合或通过继承。

继承复用:实现简单,便于扩展。但是破坏系统的封装性。

组合复用:耦合性相对较低,选择性的调用成员对象的操作。可以再运行时动态运。.

合成复用核心:尽量使用对象组合而不是继承达到复用的目的



微信公众号【Java技术江湖】一位阿里 Java 工程师的技术小站。(关注公众号后回复”Java“即可领取 Java基础、进阶、项目和架构师等免费学习资料,更有数据库、分布式、微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南、Java程序员面试指南等干货资源)

相关文章
|
3月前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性与扩展性本文旨在探讨PHP中常见的设计模式及其应用,帮助开发者编写出更加灵活、可维护和易于扩展的代码。通过深入浅出的解释和实例演示,我们将了解如何使用设计模式解决实际开发中的问题,并提升代码质量。
在软件开发过程中,设计模式是一套经过验证的解决方案模板,用于处理常见的软件设计问题。PHP作为流行的服务器端脚本语言,也有其特定的设计模式应用。本文将重点介绍几种PHP中常用的设计模式,包括单例模式、工厂模式和策略模式,并通过实际代码示例展示它们的具体用法。同时,我们还将讨论如何在实际项目中合理选择和应用这些设计模式,以提升代码的可维护性和扩展性。
68 4
|
4月前
|
设计模式 数据库连接 PHP
PHP编程中的面向对象与设计模式
在PHP编程世界中,掌握面向对象编程(OOP)和设计模式是提升代码质量和开发效率的关键。本文将深入浅出地介绍如何在PHP中应用OOP原则和设计模式,以及这些实践如何影响项目架构和维护性。通过实际案例,我们将探索如何利用这些概念来构建更健壮、可扩展的应用程序。
|
4月前
|
设计模式
设计模式七大原则
这篇文章介绍了设计模式中的七大原则,特别强调了单一职责原则,即一个类应该只有一个引起其行为变化的原因,以确保类功能的高内聚和低耦合。
|
4月前
|
设计模式 存储 前端开发
React开发设计模式及原则概念问题之自定义Hooks的作用是什么,自定义Hooks设计时要遵循什么原则呢
React开发设计模式及原则概念问题之自定义Hooks的作用是什么,自定义Hooks设计时要遵循什么原则呢
|
6月前
|
设计模式 供应链
设计模式六大原则之迪米特法则
设计模式六大原则之迪米特法则
|
3月前
|
设计模式 Java 关系型数据库
设计模式——设计模式简介和七大原则
设计模式的目的和核心原则、单一职责原则、接口隔离原则、依赖倒转原则、里氏替换原则、开闭原则、迪米特法则、合成复用原则
设计模式——设计模式简介和七大原则
|
2月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP开发领域,设计模式是解决常见问题的高效方案集合。它们不是具体的代码,而是一种编码和设计经验的总结。单例模式作为设计模式中的一种,确保了一个类仅有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的基本概念、实现方式及其在PHP中的应用。
单例模式在PHP中的应用广泛,尤其在处理数据库连接、日志记录等场景时,能显著提高资源利用率和执行效率。本文从单例模式的定义出发,详细解释了其在PHP中的不同实现方法,并探讨了使用单例模式的优势与注意事项。通过对示例代码的分析,读者将能够理解如何在PHP项目中有效应用单例模式。
|
3月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:如何提高代码的可维护性与扩展性在软件开发领域,PHP 是一种广泛使用的服务器端脚本语言。随着项目规模的扩大和复杂性的增加,保持代码的可维护性和可扩展性变得越来越重要。本文将探讨 PHP 中的设计模式,并通过实例展示如何应用这些模式来提高代码质量。
设计模式是经过验证的解决软件设计问题的方法。它们不是具体的代码,而是一种编码和设计经验的总结。在PHP开发中,合理地使用设计模式可以显著提高代码的可维护性、复用性和扩展性。本文将介绍几种常见的设计模式,包括单例模式、工厂模式和观察者模式,并通过具体的例子展示如何在PHP项目中应用这些模式。
|
3月前
|
设计模式 Java 测试技术
Java设计模式-UML与设计原则(1)
Java设计模式-UML与设计原则(1)
|
3月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
51 2