场景

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

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

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

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. -bash: ll: 未找到命令

    第一步将alias ll='ls -l'添加到/etc/profile # head /etc/profile# /etc/profilealias ll='ls -l'# System wide e ...

  2. 华为交换机Console口属性配置

    华为交换机Console口属性配置 一.设置通过账号和密码(AAA验证)登陆Console口 进入 Console 用户界面视图 <Huawei>system-view [Huawei]u ...

  3. Zabbix 常用术语

    Zabbix 常用术语 1.主机(host) 一台你想监控的网络设备,用IP或域名表示 2.主机组(host group) 主机的逻辑组;它包含主机和模板.-个主机组里的主机和模板之间并没有任何直接的 ...

  4. [rhel-media] :Yum软件仓库唯一标识符,避免与其他仓库冲突。

    第1步:进入到/etc/yum.repos.d/目录中(因为该目录存放着Yum软件仓库的配置文件). 第2步:使用Vim编辑器创建一个名为rhel7.repo的新配置文件(文件名称可随意,但后缀必须为 ...

  5. k8s运行容器之Job应用(6)

    容器按照持续运行的时间可分为两类:服务类容器和工作类容器. 服务类容器通常持续提供服务,需要一直运行,比如 http server,daemon 等.工作类容器则是一次性任务,比如批处理程序,完成后容 ...

  6. vim 编辑器高级用法

    vim编辑器介绍 如果没有安装vim使用下面方式安装 yum -y install vim vi与vim的不同 两者最大的不同:vim可以高亮显示,vi不可以. vim三种工作模式 普通模式 # 光标 ...

  7. 分布式存储ceph---ceph常用命令(3)

    1.查看ceph集群配置信息 ceph daemon /var/run/ceph/ceph-mon.$(hostname -s).asok config show 2.在部署节点修改了ceph.con ...

  8. Jlink固件更新

    故障:JLINK上的指示灯也不亮,无驱动等 文中所提工具和固件链接: 工具:http://pan.baidu.com/s/1c2z8nao 固件:http://pan.baidu.com/s/1jIB ...

  9. mysql数据库-备份与还原实操

    目录 备份工具 1 基于 LVM 的快照备份(几乎热备) 2 数据库冷备份和还原 3 mysqldump备份工具 3.1 实战备份策略 3.1.1 全备份 3.1.2 分库分表备份 3.2 mysql ...

  10. 如何屏蔽 iOS 软件自动更新,去除更新通知和标记

    适用于 iOS.iPadOS 和 watchOS,即 iPhone.iPad 和 Apple Watch 通用. 请访问原文链接:https://sysin.org/article/Disable-i ...