C#设计模式六大原则之依赖倒置原则
C#设计模式六大原则是单一职责原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特法则、开闭原则。它们不是要我们刻板的遵守,而是根据实际需要灵活运用。只要对它们的遵守程度在一个合理的范围内,努为做到一个良好的设计。以下介绍C#依赖倒置原则。
依赖倒置原则(Dependence Inversion Principle)
依赖倒置原则(Dependence Inversion Principle)是程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。面向对象的开发很好的解决了这个问题,一般情况下抽象的变化概率很小,让用户程序依赖于抽象,实现的细节也依赖于抽象。即使实现细节不断变动,只要抽象不变,客户程序就不需要变化。这大大降低了客户程序与实现细节的耦合度。
例如,
1)一般的反面设计实现
using System;
namespace ConsoleApplication
{public class HondaCar{public void Run(){Console.WriteLine("本田开始启动");}public void Turn(){Console.WriteLine("本田开始转弯");}public void Stop(){Console.WriteLine("本田开始停车");}}public class FordCar{public void Run(){Console.WriteLine("福特开始启动");}public void Turn(){Console.WriteLine("福特开始转弯");}public void Stop(){Console.WriteLine("福特开始停车");}}public class BmwCar{public void Run(){Console.WriteLine("福特开始启动");}public void Turn(){Console.WriteLine("福特开始转弯");}public void Stop(){Console.WriteLine("福特开始停车");}}public class AutoSystem{public enum CarType{Ford, Honda, Bmw};HondaCar hcar = new HondaCar();FordCar fcar = new FordCar();BmwCar bcar = new BmwCar();private CarType type;public AutoSystem(CarType type){this.type = type;}public void RunCar(){if (type == CarType.Ford){fcar.Run();}else if (type == CarType.Honda){hcar.Run();}else if (type == CarType.Bmw){bcar.Run();}}public void TurnCar(){if (type == CarType.Ford){fcar.Turn();}else if (type == CarType.Honda){hcar.Turn();}else if (type == CarType.Bmw){bcar.Turn();}}public void StopCar(){if (type == CarType.Ford){fcar.Stop();}else if (type == CarType.Honda){hcar.Stop();}else if (type == CarType.Bmw){bcar.Stop();}}}class Program{public static void Main(){AutoSystem autoSystem = new AutoSystem(AutoSystem.CarType.Honda);autoSystem.RunCar();autoSystem.TurnCar();autoSystem.StopCar();Console.ReadKey();}}
}
2)依赖倒置原则的实现
using System;
namespace ConsoleApplication
{public interface ICar{void Run();void Turn();void Stop();}public class BmwCar : ICar{public void Run(){Console.WriteLine("宝马开始启动");}public void Turn(){Console.WriteLine("宝马开始转弯");}public void Stop(){Console.WriteLine("宝马开始停车");}}public class FordCar : ICar{public void Run(){Console.WriteLine("福特开始启动");}public void Turn(){Console.WriteLine("福特开始转弯");}public void Stop(){Console.WriteLine("福特开始停车");}}public class HondaCar : ICar{public void Run(){Console.WriteLine("本田开始启动");}public void Turn(){Console.WriteLine("本田开始转弯");}public void Stop(){Console.WriteLine("本田开始停车");}}public class AutoSystem{private ICar icar;public AutoSystem(ICar icar){this.icar = icar;}public void RunCar(){icar.Run();}public void TurnCar(){icar.Turn();}public void StopCar(){icar.Stop();}}class Program{public static void Main(){AutoSystem autoSystem = new AutoSystem(new HondaCar());autoSystem.RunCar();autoSystem.TurnCar();autoSystem.StopCar();Console.ReadKey();}}
}
相关文章:
C#设计模式六大原则之依赖倒置原则
C#设计模式六大原则是单一职责原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特法则、开闭原则。它们不是要我们刻板的遵守,而是根据实际需要灵活运用。只要对它们的遵守程度在一个合理的范围内,努为做到一个良好的设计。以下介绍C#依赖倒置原则…...
IDEA的使用(二)快捷键 (IntelliJ IDEA 2022.1.3版本)
1. IDEA中的常用快捷键 1.1 通用型快捷键 1.2 提高编写速度 ctrl shift ↑或↓ 只能在方法里面移动代码。 alt shift ↑或↓ 可以向方法外移动代码。 设置过自动导包,所以不用批量导包啦。 1.3 类结构、查找和查看源码 1.4 查找、替换和关闭 1.5 调整格式 1.6 De…...
微信小程序个人账号申请和配置详细教程
一、注册小程序管理账号 1、注册方法 在微信公众平台官网首页(mp.weixin.qq.com),点击右上角的“立即注册”按钮。 2、选择注册的账号类型 选择“小程序”,点击“查看类型区别”可查看不同类型账号的区别和优势。 3、填写邮箱和…...
opencv定位图片中的图案?
import cv2 as cv2def find_positions(image_path, small_image_path):# 读取大图和小图large_image cv2.imread(image_path)small_image cv2.imread(small_image_path)# 小图规格small_image_h, small_image_w small_image.shape[:2]# 对比大图与小图# 匹配模板res cv2.ma…...
高防CDN:网络安全的不可或缺之选
在当今数字化时代,网络攻击已经成为互联网上的一种不可避免的风险。为了应对不断升级的网络威胁,许多企业和组织正在采用高防御CDN(Content Delivery Network)技术,以确保他们的在线资产得到保护,用户体验得…...
flutter 常用组件:文本、图片和按钮
文章目录 文本控件富文本控件图片本地图片网络图片按钮文本控件 ##一’码’当先 Text(这是一段文本这是一段文本这是一段文本这是一段文本这是一段文本这是一段文本这是一段文本这是一段文本,textAlign:TextAlign.center,style: TextStyle(fontWeight: FontWeight.bold, font…...
BI工具:让数据分析井然有序一望而知
BI(Business Intelligence)工具是一类专门用于数据分析和决策支持的软件工具。 它们能够将企业内部和外部的数据进行整合、处理和可视化,帮助用户从海量数据中获取有价值的见解和洞察,并以直观、易懂的方式展示给决策者和相关人员…...
2024级199管理类联考之逻辑核心基础
且与或 含义 A且B(A^B):同时存在 常见形式 A并且B既A又B不但A而且B虽然A但是BA或B:二者至少有一个成立(即A且非B,非A且B,A且B) 否定形式 且的否定 A且B否定形式:非(A^B) 非A 或 非B非A且非B否定形式:非(非A^非B) A 或 B非A且B否定形式:…...
第二次课,文件校验(预习)
hash 计算接口 Crypto API (证书,对称加密,非对称加密,编码和解码) CryptAcquireContext CryptCreateHash CryptReleaseContext CryptHashData CryptDestroyHash CryptGetHashParam 注册表操作接口 RegEnumKeyEx RegE…...
京东官方平台API接口获得JD商品详情页信息数据采集产品价格、原价、销量、商品属性名等
京东商品详情API接口的作用是获取京东平台上某个商品的详细信息,包括商品标题、价格、图片、规格、参数、店铺信息等。开发者可以通过该接口获取到商品的原始数据,方便进行数据分析、价格比较、爬取等操作。 通过该接口获取到的商品详情数据可以结合其他…...
深入篇【C++】总结智能指针的使用与应用意义(auto_ptr/unique_ptr/shared_ptr/weak_ptr)底层原理剖析+模拟实现
深入篇【C】总结智能指针的使用与应用意义&&(auto_ptr/unique_ptr/shared_ptr/weak_ptr)底层原理剖析模拟实现 智能指针的出现智能指针的使用应用意义/存在问题智能指针原理剖析模拟实现auto_ptrunique_ptrshared_ptrweak_ptr 智能指针的出现 首先我们要理…...
计算机视觉和机器视觉有什么区别?
人工智能是一个概念性术语,涵盖了若干特定技术。本文中,我们将探讨机器视觉(MV)和计算机视觉(CV)。二者都涉及可视化输入的摄取和解释,因此,了解这些重叠技术的优势、约束和最佳应用…...
【树莓派 picamera】
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言https://www.cnblogs.com/uestc-mm/p/7606855.html 一、picamera是什么?二、使用步骤1.引入库2.先要安装opencv 总结 前言 想用树莓派libcamera &a…...
HarmonyOS应用开发者基础认证【满分答案】
HarmonyOS应用开发者基础认证 一、判断题二、单选题三、多选题 一、判断题 在Column和Row容器组件中,justifyContent用于设置子组件在主轴方向上的对齐格式,alignItems用于设置子组件在交叉轴方向上的对齐格式。(正确) 所有使用C…...
CSS 常用样式——定位属性类型及特点
一、相对定位 相对定位是 CSS 中的一种定位方式,它允许我们将一个元素相对于其原始位置进行定位,而不会影响其它元素的位置和尺寸。相对定位是通过 position: relative; 属性实现的。 相对定位常用于创建位置相对于父元素的元素,以及重叠元…...
华纳云:Linux文件不存在无法删除如何解决
在Linux中,如果您要删除一个文件,但文件不存在,通常会收到类似"文件不存在"或"没有这样的文件或目录"的错误消息。这可能是由于多种原因导致的,例如文件被移动、重命名、删除,或者您没有足够的权限…...
mysql增加字段语句转为Oracle语句
mysql增加字段语句转为Oracle语句 ALTER TABLE xm_cghyADD COLUMN WDNR blob NULL COMMENT 评审会议通知HTML AFTER HYTZFJ;在Oracle中,可以使用以下SQL语句来执行ALTER TABLE操作,将xm_cghy表添加一个名为WDNR的BLOB类型列: ALTER TABLE x…...
VMware搭载linux出现的bugs
---------后续在实际Linux项目复盘过程中有遇到问题(解决办法)会不定时更新.......----------- ques: Linux自带的media目录用于挂载或可移动存储设备已满(造成这一原因是由于我多次创建新的虚拟机并在同一虚拟目录下挂载同一镜象导致有些残存文件没有删除干净&…...
websocket逆向-protobuf序列化与反序列化
系列文章目录 训练地址:https://www.qiulianmao.com 基础-websocket逆向基础-http拦截基础-websocket拦截基础-base64编码与解码基础-protobuf序列化与反序列化视频号直播弹幕采集实战一:Http轮询更新中 websocket逆向-protobuf序列化与反序列化基础 系…...
车载电子电器架构 —— 国产基础软件生态简介
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10pip3.10) 一:前言二:安装编译依赖二:安装Python3.10三:安装PIP3.10四:安装Paddlepaddle基础框架4.1…...
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一:HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二:Floyd 快慢指针法(…...
何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡
何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践,很多人以为AI已经强大到不需要程序员了,其实不是,AI更加需要程序员,普通人…...
