面向对象设计的SOLID原则

1.开放封闭原则

一个软件实体 (类,函数,模块) 对扩展开放,对修改关闭。也就是 软件实体 应该尽量在不修改原有代码的情况下 进行扩展

举个例子,

装饰器的使用,就可以给某个函数增加新的功能,

类的继承,实现复用 父类的方法

2. 里氏替换原则

所有引用父类的地方必须能够 透明的使用子类对象

from abc import ABCMeta, abstractmethod

class User:

    def show_name(self):
pass class VIPUser(User): def show_name(self):
pass def show_user_name(u):
u.show_name() if __name__ == '__main__':
u = User()
show_user_name(u)

上面的show_user_name方法 传入User对象没问题的话,传入子类的对象VIPUser()对象 也应当是ok的

3. 依赖倒置原则

高层模块不应该依赖底层模块,二者都应该依赖抽象,抽象不应该依赖细节,细节应该依赖抽象

换言之,需要针对接口编程,而不是针对实现编程

就拿上一篇中关于支付的例子来举例:

调用方(客户端,高层模块)调用接口(底层模块)的时候, 不需要care 具体如何实现支付这个方法的

也不care这个实现方法的效率 关注的只是这个支付方法的传入参数 以及 方法的返回值

这个支付的方法 就是抽象出来的接口,

而具体实现过程是依赖这个抽象接口 而生存的,

但是抽象的接口依赖具体的细节 包括你用别的语言实现 或者调用别的第三方实现 都无所谓

4. 接口隔离原则

使用多个换专门的接口,而不是使用单一的总接口,

也就是, 客户端不应该依赖那些它不需要的接口

举个例子:

class Animal(metaclass=ABCMeta):

    @abstractmethod
def walk(self):
pass @abstractmethod
def swim(self):
pass @abstractmethod
def fly(self):
pass class Tiger(Animal): def walk(self):
pass def swim(self):
# 老虎不会游泳
pass def fly(self):
# 老虎不会飞
pass

上面的例子中,Animal这个类定义了三个抽象方法,所有继承Animal类的子类 都必须 要实现walk swim fly三个方法 但是老虎只会跑 不会飞 也不会 游泳怎么办?????

接口隔离原则就派上用场了

from abc import ABCMeta, abstractmethod

class LandAnimal(metaclass=ABCMeta):

    @abstractmethod
def walk(self):
pass class WaterAnimal(metaclass=ABCMeta): @abstractmethod
def swim(self):
pass class SkyAnimal(metaclass=ABCMeta): @abstractmethod
def fly(self):
pass class Tiger(LandAnimal): def walk(self):
pass class Frog(LandAnimal, WaterAnimal): def swim(self):
pass def walk(self):
pass class Swan(WaterAnimal, SkyAnimal):
def swim(self):
pass def fly(self):
pass

将Animal这个类根据功能(方法 method)的不同进行拆分

5. 单一职责

不要存在多于一个导致类变更的原因

通俗的讲一个类只负责一项职责

面向对象SOLID原则-设计模式-第2篇的更多相关文章

  1. 面向对象SOLID原则的自我理解

    S.O.L.I.D 是面向对象设计(OOD)和面向对象编程(OOP)中的几个重要编码原则(Programming Priciple)的首字母缩写.面向对象设计的原则SRP The Single Res ...

  2. 浅谈 SOLID 原则的具体使用

    SOLID 是面向对象设计5大重要原则的首字母缩写,当我们设计类和模块时,遵守 SOLID 原则可以让软件更加健壮和稳定.那么,什么是 SOLID 原则呢?本篇文章我将谈谈 SOLID 原则在软件开发 ...

  3. 面向对象的SOLID原则白话篇

    面向对象的SOLID原则 简介 缩写 全称 中文 S The Single Responsibility Principle 单一责任原则 O The Open Closed Principle 开放 ...

  4. 在net中json序列化与反序列化 面向对象六大原则 (第一篇) 一步一步带你了解linq to Object 10分钟浅谈泛型协变与逆变

    在net中json序列化与反序列化   准备好饮料,我们一起来玩玩JSON,什么是Json:一种数据表示形式,JSON:JavaScript Object Notation对象表示法 Json语法规则 ...

  5. OOD 面向对象面试干货分享| 面向对象设计的SOLID原则

    S.O.L.I.D是面向对象设计和编程(OOD&OOP)中几个重要编码原则(Programming Priciple)的首字母缩写. 简写 全拼 中文翻译 SRP The Single Res ...

  6. 【设计模式】第一篇:概述、耦合、UML、七大原则,详细分析总结(基于Java)

    迷茫了一周,一段时间重复的 CRUD ,着实让我有点烦闷,最近打算将这些技术栈系列的文章先暂时搁置一下,开启一个新的篇章<设计模式>,毕竟前面写了不少 "武功招式" 的 ...

  7. 【转】面向对象设计的SOLID原则

    S.O.L.I.D是面向对象设计和编程(OOD&OOP)中几个重要编码原则(Programming Priciple)的首字母缩写. SRP The Single Responsibility ...

  8. 面向对象设计的SOLID原则

    S.O.L.I.D是面向对象设计和编程(OOD&OOP)中几个重要编码原则(Programming Priciple)的首字母缩写. SRP The Single Responsibility ...

  9. 面向对象涉及SOLID原则

    S = Single Responsibility Principle 单一职责原则 O = Opened Closed Principle 开放闭合原则  L = Liscov Substituti ...

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

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

随机推荐

  1. C#_Win32_PInvoke源码生成器

    介绍 一个源代码生成器,用于向 C#项目添加一组用户定义的 Win32 P/Invoke 方法和相关的类型. 链接地址: https://github.com/microsoft/CsWin32 还在 ...

  2. 安卓之各组件的LayoutParams分析

    文章摘要 在Android开发中,LayoutParams是一个非常重要的概念,它用于描述View在其父容器中的布局行为.不同的ViewGroup有不同的LayoutParams子类,例如Linear ...

  3. .NET中如何实现高精度定时器

    .NET中有多少种定时器一文介绍过.NET中至少有6种定时器,但精度都不是特别高,一般在15ms~55ms之间.在一些特殊场景,可能需要高精度的定时器,这就需要我们自己实现了.本文将讨论高精度定时器实 ...

  4. Javascript Ajax总结——其他跨域技术之图像Ping和JSONP

    在CORS出现之前,为实现跨域Ajax通信,开发人员利用DOM中能够执行跨域请求的功能,在不依赖XHR对象的情况下也能发送某种请求.1.图像Ping这里使用<img>标签.一个网页可以从任 ...

  5. spring与jndi(数据库连接)SpringBoot打war包并整合jsp

    spring与jndi(数据库连接)SpringBoot打war包并整合jsp,这里的jndi指的是jdbc连接,不是其他的.有传统servlet+spring和springboot的jndi连接操作 ...

  6. Java 集合(二) Map

    Map 定义的是键值对的映射关系,一般情况下,都会选择 HashMap 作为具体的实现,除了 HashMap 之外,另一个使用到的比较多的 Map 实现是 TreeMap HashMap 构造函数 H ...

  7. 文心一言 VS 讯飞星火 VS chatgpt (33)-- 算法导论5.2 5题

    五.设A[1..n]是由n个不同数构成的数列.如果i<j且A[i]>A[j],则称(i,j)对为A的一个逆序对(inversion).(参看思考题2-4 中更多关于逆序对的例子.)假设A的 ...

  8. 垃圾回收你懂,Java垃圾回收你懂吗?

    摘要:在用 C 之类的编程语言时,程序员需要自己手动分配和释放内存.而 Java 不一样,它有垃圾回收器,释放内存由回收器负责.本文接下来将介绍Java垃圾收集的知识原理. java内存区域 Q: J ...

  9. 企业研发治理转型利器:华为云发布流水线服务CodeArts Pipeline

    摘要:2月27日,华为云正式发布流水线服务CodeArts Pipeline,旨在提升编排体验,开放插件平台,以及提供标准化的DevOps企业治理模型,将华为公司内的优秀研发实践赋能给伙伴和客户. 本 ...

  10. TICS端到端实践:企业积分查询作业开发

    摘要:本次TICS端到端体验,将以一个"小微企业信用评分"的场景为例. 本文分享自华为云社区<基于华为隐私计算产品TICS实现端到端的企业积分查询作业[玩转华为云]>, ...