面向对象设计的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. zookeeper JavaApi 查询节点

    /** * 1.查询数据 :get * 2.查询子节点 : ls * 3.查询节点的状态信息 :ls -s * * */ @Test public void testGet1() throws Exc ...

  2. Android WebView 缓存处理

    加载html时,会在data/应用下生成database和cache两个文件夹:请求的url存在webviewcache.db下面,url的内容保存在webviewCache下面, Webview的两 ...

  3. 【eBPF-02】入门:基于 BCC 框架的程序进阶

    本文是 eBPF 系列的第二篇文章,我们来学习 eBPF BCC 框架的进阶用法,对上一篇文章中的代码进行升级,动态输出进程运行时的参数情况. 主要内容包括: 通过 kprobe 挂载内核事件的 eB ...

  4. 整一个工具类【根据URL地址获取file文件对象】

    整一个工具类[根据URL地址获取file文件对象] 直接将网络url文件转换为file对象 import java.io.*; import java.net.URL; public class Im ...

  5. springboot整合mybatis步骤思路

    /** * springboot整合mybatis步骤思路 * 依赖导入 * 建表 * 实体类 * mapper配置文件 * mapper接口 * yaml配置 * properties配置数据库连接 ...

  6. Docker 部署工具

    Docker 容器的创建比较简单,容器解决了应用程序对于运行环境的依赖问题,但是在当前所处的微服务盛行的情况下,手动管理容器是一件比较重复其及其枯燥的工作,这项工作理论上可以通过计算机来完成,因此涌现 ...

  7. k8s初始化pod-pod标签

    目录 initContainers(初始化容器) 静态pod pod的调度策略(将pod指派给特定节点) initContainers(初始化容器) k8s在1.3版本的时候引入了一个初始化容器(in ...

  8. 未经授权访问 .js

    流程顺序:后台管理登陆地址 → 后台主页地址 → fuzz测试出用户管理列表接口 → 直接调接口..全程黑盒. 那么接下来我逆着来推理下逻辑: 首先是拿到某后台管理登录的网址 接着查看html源码,发 ...

  9. linux中创建新用户并且放到用户组中

    1.打开终端并以 root 用户身份登录到 Linux 系统 2.使用以下命令创建一个新用户 sudo useradd -m username 将 "username" 替换为你要 ...

  10. Picker 选择器

    WXML 文件中 <view class="container"> <view> <text>选择器的值: {{pickerValue}}< ...