场景

针对园区停车信息,需要对各个公司提供的停车数据进行整合并录入自家公司的大数据平台

数据的录入无外乎就是对数据的增删改查

下面上一个常规的写法(未符合依赖倒置),整合来自 长安和丰田 的停车数据

class Changan(object):
def __init__(self):
self.type = 'changan' def ca_add(self):
print('%s 新增' % self.type) def ca_del(self):
print('%s 删除' % self.type) def ca_modify(self):
print('%s 修改' % self.type) def ca_get(self):
print('%s 查询' % self.type) class Toyota(object):
def __init__(self):
self.type = 'fengtian' def tyt_add(self):
print('%s 新增' % self.type) def tyt_del(self):
print('%s 删除' % self.type) def tyt_modify(self):
print('%s 修改' % self.type) def tyt_get(self):
print('%s 查询' % self.type) class Data(object): def __init__(self, car):
self.car = car def data_add(self):
if self.car.type == 'changan':
self.car.ca_add()
else:
self.car.tyt_add() def data_del(self):
if self.car.type == 'changan':
self.car.ca_del()
else:
self.car.tyt_del() def data_mofify(self):
if self.car.type == 'changan':
self.car.ca_modify()
else:
self.car.tyt_modify() def data_get(self):
if self.car.type == 'changan':
self.car.ca_get()
else:
self.car.tyt_get() if __name__ == '__main__':
ca = Changan()
tyt = Toyota()
autosystem = Data(ca)
autosystem.data_add()
autosystem.data_del()
autosystem.data_modify()
autosystem.data_get()
autosystem.car = tyt
print('*' * 50)
autosystem.data_add()
autosystem.data_del()
autosystem.data_modify()
autosystem.data_get()

运行的结果如下

changan 新增
changan 删除
changan 修改
changan 查询
**************************************************
fengtian 新增
fengtian 删除
fengtian 修改
fengtian 查询

可以看到最后的Data类是一个简单工厂,通过面向流程的方式对数据进行增删改查,上层的Data类永远都要依赖下层的Changan类和Toyota类,假设未来Changan类和Toyota类因为需求变更导致实现方式变了,那么Data类也会跟着改,或者未来又来一家新的厂商铃木Suzuki,那么在Data又要多写很多if else。这样的改动对于程序员来说是致命的,每一次变动需要改动的地方都很多,问题油然而生。

如何解决

遵循依赖倒置原则,根据

"程序要依赖于抽象接口,不要依赖于具体实现。"

通过changan、toyota这些类的公共性,把处理数据的方法通过接口抽象出来

import abc

class DataProcessing(metaclass=abc.ABCMeta):
"""
抽象类
抽象新增改查
"""
@abc.abstractmethod
def data_add(self, *args, **kwargs):
pass @abc.abstractmethod
def data_del(self, *args, **kwargs):
pass @abc.abstractmethod
def data_modify(self, *args, **kwargs):
pass @abc.abstractmethod
def data_get(self, *args, **kwargs):
pass class Changan(DataProcessing):
def __init__(self):
self.type = 'changan' def data_add(self):
print('%s 新增' % self.type) def data_del(self):
print('%s 删除' % self.type) def data_modify(self):
print('%s 修改' % self.type) def data_get(self):
print('%s 查询' % self.type) class Toyota(DataProcessing):
def __init__(self):
self.type = 'fengtian' def data_add(self):
print('%s 新增' % self.type) def data_del(self):
print('%s 删除' % self.type) def data_modify(self):
print('%s 修改' % self.type) def data_get(self):
print('%s 查询' % self.type) class Data(object): def __init__(self, car):
self.car = car def data_add(self):
self.car.data_add() def data_del(self):
self.car.data_del() def data_modify(self):
self.car.data_modify() def data_get(self):
self.car.data_get() if __name__ == '__main__':
ca = Changan()
tyt = Toyota()
autosystem = Data(ca)
autosystem.data_add()
autosystem.data_del()
autosystem.data_modify()
autosystem.data_get()
autosystem.car = tyt
print('*' * 50)
autosystem.data_add()
autosystem.data_del()
autosystem.data_modify()
autosystem.data_get()

运行后结果依然为

changan 新增
changan 删除
changan 修改
changan 查询
**************************************************
fengtian 新增
fengtian 删除
fengtian 修改
fengtian 查询

以上可看出,增删改查已经抽象成DataProcessing里面的方法,以后不管Changan类和Toyota类怎么变动,或者需要新增一个Suzuki类什么的,上层的Data类都不用改变,if name == 'main' 后客户端的调用也不需要怎么改动,代码层次也更清晰,便于后续的扩展。

文章来自 Yongchin'blog yongchin.xyz

python3 依赖倒置原则示例的更多相关文章

  1. C++ 设计模式 依赖倒置原则 简单示例

    C++ 设计模式 依赖倒置原则 简单示例 /** * 依赖倒置原则(Dependency Inversion Principle) * 依赖于抽象(接口),不要依赖具体的实现(类),也就是针对接口编程 ...

  2. C#软件设计——小话设计模式原则之:依赖倒置原则DIP

    前言:很久之前就想动笔总结下关于软件设计的一些原则,或者说是设计模式的一些原则,奈何被各种bootstrap组件所吸引,一直抽不开身.群里面有朋友问博主是否改行做前端了,呵呵,其实博主是想做“全战”, ...

  3. 依赖倒置原则(Dependency Inversion Principle)

    很多软件工程师都多少在处理 "Bad Design"时有一些痛苦的经历.如果发现这些 "Bad Design" 的始作俑者就是我们自己时,那感觉就更糟糕了.那么 ...

  4. 3.依赖倒置原则(Dependence Inversion Principle)

    1.定义 高层模块不应该依赖于低层模块,二者都应该依赖于抽象:抽象不应该依赖细节:细节应该依赖抽象. 2.定义解读 依赖倒置原则在程序编码中经常运用,其核心思想就是面向接口编程,高层模块不应该依赖低层 ...

  5. SOLDI原则之DIP:依赖倒置原则

    本篇介绍软件设计原则之一DIP:依赖倒置原则.很多知识回头来看会有新的理解.看到一句话,一段文字,一个观点有了新的理解,醍醐灌顶的感觉.这种感觉像是一种惊喜.古语说:温故而知新. DIP:依赖倒置原则 ...

  6. IOS设计模式的六大设计原则之依赖倒置原则(DIP,Dependence Inversion Principle)

    定义 高层模块不应该依赖于低层模块,二者都应该依赖于抽象:抽象不应该依赖细节:细节应该依赖抽象. 定义解读 依赖倒置原则在程序编码中经常运用,其核心思想就是面向接口编程,高层模块不应该依赖低层模块(原 ...

  7. 北风设计模式课程---依赖倒置原则(Dependency Inversion Principle)

    北风设计模式课程---依赖倒置原则(Dependency Inversion Principle) 一.总结 一句话总结: 面向对象技术的根基:依赖倒置原则(Dependency Inversion ...

  8. 依赖倒置原则(Dependence Inversion Principle)

    目录 背景 说明 例子 "倒置"的解释 总结 参考资料 背景 这几天组内的人一起学习DDD,里面再次提到了依赖倒置原则,在这学习过程中,大家又讨论了一下依赖倒置原则. 说明 采用依 ...

  9. 对依赖倒置原则(DIP)及Ioc、DI、Ioc容器的一些理解

    1.概述 所谓依赖倒置原则(Dependence Inversion Principle)就是要依赖于抽象,不要依赖于具体.简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模 ...

随机推荐

  1. jmeter完成一个简单的性能测试(jp@gc - PerfMon Metrics Collector的运用)

    场景:公司项目解耦,在项目前期对新的架构进行简单的性能测试 工具:jmeter 1.大致结构如下: 1800秒(半个小时)内持续产生20000的线程 创建了聚合报告,主要是查看服务器响应结果以及相应时 ...

  2. Android屏幕适配全攻略(最权威的官方适配指导)屏幕尺寸 屏幕分辨率 屏幕像素密度 dpdipdpisppx mdpihdpixdpixxdpi

    Android屏幕适配全攻略(最权威的官方适配指导)原创赵凯强 发布于2015-05-19 11:34:17 阅读数 153734 收藏展开 转载请注明出处:http://blog.csdn.net/ ...

  3. 010.kubernets的调度系统之daemonset

    daemonset简单操作使用 Deployment 是 Kubernetes 中用于处理无状态服务的资源,而 StatefulSet 是用于支持有状态服务的资源,这两种不同的资源从状态的角度对服务进 ...

  4. Python3统计gitlab上的代码量

    import threading import gitlab import xlwt #获取所有的user def getAllUsers(): usersli = [] client = gitla ...

  5. kylin剪枝优化的两种方式

    1.衍生维度. 在kylin中,如果某些维度都属于同一种类型,且数量较多,可以考虑做成衍生维度. 衍生维度就是将一批维度做成一张维度表,只在源表中保留这张表的外键,这样预处理的时候,就只会处理这个外键 ...

  6. Windows登录服务器CLI运行脚本出现 syntax error: unexpected end of file 错误的解决

    0.前言 通常我们在编辑 Linux 服务器上的文件时,直接在 Linux 环境比较麻烦(当然熟练使用 VIM 的程序员除外哈哈),有时我们会使用 Windows 将文件编辑好再上传到服务器端,我用的 ...

  7. OpenResty搭建高性能服务端

    OpenResty搭建高性能服务端   Socket编程 Linux Socket编程领域为了处理大量连接请求场景,需要使用非阻塞I/O和复用,select.poll.epoll是Linux API提 ...

  8. Python+Selenium自动化-安装模块和浏览器驱动操作方法

    Python+Selenium自动化-安装模块和浏览器驱动操作方法 1.安装模块文件 pip install selenium 2.安装浏览器驱动 我们主要用的浏览器驱动有chrome浏览器.fire ...

  9. TensorFlow六种激活函数

    TensorFlow六种激活函数 每个神经元都必须有激活函数.神经元提供了模拟复杂非线性数据集所必需的非线性特性.该函数取所有输入的加权和,进而生成一个输出信号.把它看作输入和输出之间的转换.使用适当 ...

  10. cuGraph-GPU图形分析

    cuGraph-GPU图形分析 所述RAPIDS cuGraph库是GPU的集合加速图形算法,在GPU DataFrames中发现过程数据.cuGraph的愿景是使图分析无处不在,以至于用户只是根据分 ...