一文让你搞懂面向对象设计原则(单一职责原则,开闭原则,里氏代换原则,依赖倒转原则,接口隔离原则,合成复用原则,迪米特法则)

面向对象设计原则

	可维护性:指软件能够被理解,改正,适应及扩展的难易程度。
	
	可复用性:指软件能够被重复使用的难易程度。
	
	面向对象设计的目标之一在于支持可维护性服用,一方面需要实现设计方案或者源代码的服用,另一方面
	
	要确保系统能够易于扩展和修改,具有良好的可维护性。
	
	面向对象设计原则为支持可维护性服用而诞生
	
	指导性原则,非强制性原则。
	
	每一个设计模式都符合一个或多个面向对象设计原则,面向对象设计原则是用于评价
	一个设计模式的使用效果的重要指标之一。

面向对象设计原则概述

	单一职责原则:一个对象应该只包含单一的职责,并且该职责被完整的封装在一个类中。使用频率四颗星。
	
	开闭原则:软件实现应当对扩展开放,对修改关闭。使用频率五颗星
	
	里氏代换原则:所有引用基类的地方必须能透明的使用其子类的对象。使用频率五颗星。
	
	依赖倒转原则:高层模块不应该依赖底层模块,它们都应该依赖抽象,抽象不应该依赖于细节,
	细节应该依赖于抽象。使用频率五颗星
	
	接口隔离原则:客户端不应该依赖它不需要的接口。使用频率两颗星
	
	合成复用原则:优先使用对象组合,而不是继承来达到复用的目的。使用频率四颗星
	
	迪米特法则:每一个软件单元对其他的单元都只有最少的知识,而且局限于那些与本单位密切
	相关的软件单元。 使用频率三颗星。

单一职责原则定义

单一职责原则是最简单的面向对象设计原则,用于控制类的粒度大小

单一职责原则:一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。

就一个类而言,应该仅有一个引起它变化的原因。

单一职责原则分析:

一个类(大到模块,小到方法)承担的职责越多,它被复用的可能性就越小

当一个职责变化时,可能会影响其他职责的运作

将这些职责进行分离,将不同的职责封装在不同的类中

将不同变化的原因封装在不同的类中。

单一职责原则是实现高内聚,低耦合的指导方针。

登录类没有使用单一职责原则时的UML设计:

在这里插入图片描述

登录类使用单一职责原则时的UML设计:

在这里插入图片描述

开闭原则定义:

开闭原则是面向对象的可复用设计的第一块基石,是最重要的面向对象设计原则。

开闭原则:软件实体应当对外扩展开放,对修改关闭。

开闭原则分析:

开闭原则由Bertrand Meyer于1988年提出。

在开闭原则的定义中,软件实体可以是一个软件模块,一个由多个类组成的局部结构或一个独立的类。

开闭原则是指软件实体应尽量在不修改原有代码的情况下进行扩展。

抽象化是开闭原则的关键。

相对稳定的抽象层+灵活的具体曾。

对可变性封装原则:找到系统的可变因素并将其封装起来。

登录按钮没有使用开闭原则时的UML设计:

在这里插入图片描述

登录按钮使用开闭原则时的UML设计: 在这里插入图片描述

里氏代换原则定义:

	里氏代换原则:所有引用基类的地方必须能透明的使用其子类的对象。

里氏代换原则分析:

	在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常。

	反过来则不一定成立,如果一个软件实体使用的是一个子类对象的话,那么它不一定能够使用基类的对象。

	在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型。

没有使用里氏代换原则的UML设计

在这里插入图片描述

使用里氏代换原则的UML设计

在这里插入图片描述

依赖倒转原则定义:

	依赖倒转原则:高层模块不应该依赖低层模块,它们都应该依赖抽象,抽象不应该依赖于细节,细节应该依赖于抽象。

	要针对接口编程,不要针对实现编程。

依赖倒装原则分析:

在程序代码中传递参数时或在关联关系中,尽量引用层次高的抽象层类,即使用接口或抽象类进行变量类型声明,
参数类型声明,方法返回类型声明,以及数据类型的转换。

在程序中尽量使用抽象层进行编程,而将具体类写在配置文件中。

针对抽象层编程,将具体类的对象通过依赖注入的方式注入到其他对象。

构造注入
setter注入
接口注入

没有使用依赖倒转的UML图设计

在这里插入图片描述

实例说明

在这里插入图片描述

使用依赖倒转原则的UML图设计

接口隔离原则定义:

接口隔离原则:客户端不应该依赖那些它不需要的接口

接口隔离原则分析

当一个接口太大时,需要将他分割成一些更细小的接口。

使用该接口的客户端仅需知道与之相关的方法即可。

每一个接口应该承担一种相对独立的角色,不干不该干的事情,该干的事情都要干。

接口定义(1):一个类型所提供的所有方法特征的集合,一个接口代表一个角色,每个角色
都有它特定的一个接口,角色隔离原则。

接口定义(2):狭义的特定语言的接口,接口仅仅提供客户端需要的行为,客户端不需要的行为则隐藏起来,
应当为客户端提供尽可能小的单独的接口,而不要提供大的总接口,每个接口中只包含一个客户端所需
的方法, 定制服务。

没有使用接口隔离原作的UML图设计:

在这里插入图片描述

使用接口隔离原则的UML图设计:

在这里插入图片描述

合成复用原则定义:

合成复用原则又称为组合/聚合复用原则。

合成复用原则:优先使用对象组合,而不是继承来达到复用的目的。

合成复用原则分析:

	合成复用原则就是在一个新的对象里通过关联关系(包括组合关系和聚合关系)来使用一些已有的对象,使之成为
	新对象的一部分。

	新对象通过委派调用已有对象的方法达到复用功能的目的

	复用时尽量使用组合/聚合关系,少用继承。

	继承复用:实现简单,易于扩展,破坏系统的封装性;从基类继承而来的实现是静态的,不可能在运行时发生改变
	没有足够的灵活性;只能在有限的环境中使用(白箱 复用)。

	组合/聚合复用:耦合度相对较低,有选择性地调用成员对象的操作;可以在运行时动态进行,
	新对象可以动态地引用与成员对象类型相同的其他对象。(黑箱 复用)

没有使用合成复用原则的UML图

在这里插入图片描述

实例说明:

使用合成复用原则的UML图:

迪米特法则定义:

	迪米特法则又称为最少知识原则

	迪米特法则:每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单元。

迪米特法则分析:

	迪米特法则要求:一个软件实体应当尽可能少地与其他实体发生相互作用

	应用迪米特法则则可降低系统的耦合度,使类与类之间保持松散的耦合关系。

	迪米特法则要求在设计系统时,应该尽量减少对象之间的交互。
	
	如果两个对象之间不必彼此直接通信,那么这两个对象就不应该发生任何直接的相互作用。

	如果其中一个对象需要调用另一个对象的方法,可以通过第三者转发这个调用。

	通过引入一个合理的第三者,来降低现有对象之间的耦合度。

没有使用迪米特法则的UML图:

在这里插入图片描述

使用迪米特法则的UML设计

在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python面向对象编程(Object-Oriented Programming,简称OOP)是一种程序设计方法,它将数据和操作数据的方法组合成对象,通过定义类(class)来创建对象。下面是一些概念和原则,可以帮助你更好地理解Python面向对象编程。 1. 类和对象: - 类是一种抽象的数据类型,它定义了对象的属性和方法。 - 对象是类的实例,它具有类定义的属性和方法。 2. 属性和方法: - 属性是对象的数据,可以是整数、字符串、列表等。 - 方法是对象的行为,可以是函数或过程。 3. 封装: - 封装是将数据和对数据的操作封装在一起,以创建一个独立的实体。 - 使用类来封装数据和方法,可以隐藏实现细节,提高代码的可读性和可维护性。 4. 继承: - 继承是一种机制,允许一个类继承另一个类的属性和方法。 - 子类可以重用父类的代码,并且可以添加新的属性和方法。 5. 多态: - 多态是指同一个方法可以在不同的类中具有不同的实现方式。 - 多态可以提高代码的灵活性和可扩展性。 下面是一个简单的例子,展示了如何定义一个类、创建对象并调用对象的方法: ```python class Person: def __init__(self, name, age): self.name = name self.age = age def say_hello(self): print(f"Hello, my name is {self.name} and I'm {self.age} years old.") # 创建对象 person = Person("Alice", 25) # 调用对象的方法 person.say_hello() ``` 这个例子定义了一个名为`Person`的类,它有两个属性(`name`和`age`)和一个方法(`say_hello`)。我们通过`Person`类创建了一个名为`person`的对象,并调用了它的`say_hello`方法。 希望这个简单的例子能帮助你更好地理解Python面向对象编程。如果你有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值