关于抽象类和接口的区别,可以参考之前的文章~http://www.cnblogs.com/leestar54/p/4593173.html

using System;
using System.Collections.Generic;
using System.Text; namespace DependenceInversionPrinciple
{
//依赖倒置(Dependence Inversion Principle)DIP
//High level modules should not depend upon low level modeules.Both should depend upon abstractions.Abstractions should not depend upon details. Details shoudl depend upon abstractions.
//(1)模块间的依赖通过抽象发生,实现类直接不发生直接的依赖关系,其依赖关系是通过接口或者抽象类产生的。
//(2)接口或抽象类不依赖于实现类
//(3)实现类依赖接口或抽象类。
//OOD(Object-Oriented Design)面向接口编程精髓之一。
class Program
{
static void Main(string[] args)
{
//模拟这么一个场景,司机开车遇到查车情况。
Driver driver = new Driver("小李");
Benz benz = new Benz();
BMW bmw = new BMW();
//多亏了依赖倒置,这样不用在Drive函数里每次针对不同的车型写一个方法,因为它们都是车子,开起来其实是一样的,管他什么牌子。
driver.Drive(benz);
//换一辆车开
driver.Drive(bmw); //这时遇到了交警,查车,千万别酒驾哟!
CheckLicense(driver);
} //这里使用IC1,而没有使用Driver类来做参数类,是因为交警只关注你的驾照情况,如果使用Driver类,会暴露过多的方法和属性,照成不必要的耦合风险。
static void CheckLicense(IC1 c1)
{
c1.ShowInfo();
}
} //C1驾照接口,有了驾照的人,肯定都可以开小汽车了,不管你的职业是不是司机,这是一个共同的“行为”。
public interface IC1
{
void ShowInfo();
void Drive(Car car); } public class Driver : IC1
{
public Driver(string name)
{
this.Name = name;
} private string name; public string Name
{
get { return name; }
set { name = value; }
} public void Drive(Car car)
{
car.Start();
car.Stop();
} public void ShowInfo()
{
Console.WriteLine(this.Name + "的驾照是C1驾照");
}
} //抽象车子,肯定有启动和停止,至于不同车子实现方式不同,抽象出来,给子类实现。
//为什么不使用接口?这需要关注业务情况进行抽象设计,如果该业务方法涉及到其他的交通工具,如自行车,这个时候用接口,能增强扩展性,扩展一个自行车类,继承接口即可使用。
//但是这里没有涉及到,仅专注于小汽车,所以抽象类即可。
public abstract class Car
{
private string brand; public string Brand
{
get { return brand; }
set { brand = value; }
} public abstract void Start(); public abstract void Stop(); } public class BMW : Car
{
public BMW()
{
this.Brand = "宝马";
} public override void Start()
{
Console.WriteLine(this.Brand + "汽车启动");
} public override void Stop()
{
Console.WriteLine(this.Brand + "汽车停止");
}
} public class Benz : Car
{
public Benz()
{
this.Brand = "奔驰";
} public override void Start()
{
Console.WriteLine(this.Brand + "汽车启动");
} public override void Stop()
{
Console.WriteLine(this.Brand + "汽车停止");
}
}
}

依赖倒置(Dependence Inversion Principle)DIP的更多相关文章

  1. IOC-控制反转(Inversion of Control),也成依赖倒置(Dependency Inversion Principle)

    基本简介 IoC 亦称为 “依赖倒置原理”("Dependency Inversion Principle").差不多所有框架都使用了“倒置注入(Fowler 2004)技巧,这可 ...

  2. 设计模式-依赖倒置-Dependency Inversion Principle

    依赖倒置原则: 一般来说我们认为作为底层基础框架的逻辑是不应该依赖于上层逻辑的, 所以我们设计软件时也经常是: 需求 - 上层逻辑(直接实现需求) - 发现需要固化的逻辑 - 开发底层模块 - 然后上 ...

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

    依赖倒转原则就是 A.要依赖于抽象,不要依赖于实现.(Abstractions should not depend upon details. Details should depend upon a ...

  4. 面象对象设计原则之五:依赖倒置原则(The Dependency Inversion Principle,DIP)

    如果说开闭原则是面向对象设计的目标的话,那么依赖倒转原则就是面向对象设计的主要实现机制之一,它是系统抽象化的具体实现.依赖倒转原则是Robert C. Martin在1996年为“C++Reporte ...

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

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

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

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

  7. 设计模式六大原则(三):依赖倒置原则(Dependence Inversion Principle)

    依赖倒置原则(DIP)定义: 高层模块不应该依赖低层模块,二者都应该依赖其抽象:抽象不应该依赖细节:细节应该依赖抽象. 问题由来: 类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码 ...

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

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

  9. 【设计模式六大原则3】依赖倒置原则(Dependence Inversion Principle)

      定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象:抽象不应该依赖细节:细节应该依赖抽象. 问题由来:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成.这种场景下,类 ...

随机推荐

  1. document.domain 跨域问题

    document.domain用来得到当前网页的域名. 比如在地址栏里输入:javascript:alert(document.domain); //www.315ta.com我们也可以给docume ...

  2. Sharepoint 文档知识管理系统--Word在试图打开文件时遇到错误

    在系统开发中,遇到问题:SharePoint 2010与Office 2010安装在一台服务器上,当用Office打开SharePoint文档库中的文档时,遇到“Word在试图打开文件时遇到错误,请尝 ...

  3. AD对象DirectoryEntry本地开发

    DirectoryEntry类如果需要在本地计算机开发需要满足以下条件: 1.本地计算机dns解析必须和AD域控制器的dns保持一致,如图: 2.必须模拟身份验证,才能操作查询AD用户 /// < ...

  4. Oracle累计函数

    今天遇到一个客户的报表需求,在shipment的报表中要查看该shipment中的每个PO的采购数量,当前shipment的出货数量以及累计的所有出货数量. 要有累计的出货数,并且是要有顺序的累计出货 ...

  5. SQL Server 根据关键字和结束符提取字符串子串

    /* @info-待截取的字符串 @indexStr-截取子串的起始字符串 @split-截取子串的结束符号 列入依次传入 胸片:正常.心电图:异常,需要注意.血常规检查:正常. 心电图 '.' 返回 ...

  6. windows下安装newman

    1.下载安装node.js,下载地址::https://nodejs.org/en/download/,这里我下载的为v10.15.0-x64.msi,下载后直接安装即可,安装完后可输入node -v ...

  7. kali linux之BurpSuite

    web安全工具中的瑞士军刀,统一的集成工具发现web安全漏洞 所有的工具共享一个能处理并显示http消息的可扩展框架, 模块之间无缝交换信息. 有free版和professional版,java开发, ...

  8. redis集群如何解决重启不了的问题

    redis使用集群部署,如果遇到断电或者服务器重启,当再次启动的时候,有时候会启动不了.需要使用trib的fix命令进行修复.如果修复还是不行的话,可以清除节点数据再重新建集群,前提要备份之后操作. ...

  9. 【BlockingQueue】BlockingQueue 阻塞队列实现

    前言: 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便 ...

  10. SpringMVC中视图解析器

    视图解析器:固定写法直接coppy就行 1.dispatcherServlet-servlet.xml中添加 <!-- 视图解析器InternalResourceViewResolver --& ...