依赖倒置(Dependence Inversion Principle)DIP
关于抽象类和接口的区别,可以参考之前的文章~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的更多相关文章
- IOC-控制反转(Inversion of Control),也成依赖倒置(Dependency Inversion Principle)
基本简介 IoC 亦称为 “依赖倒置原理”("Dependency Inversion Principle").差不多所有框架都使用了“倒置注入(Fowler 2004)技巧,这可 ...
- 设计模式-依赖倒置-Dependency Inversion Principle
依赖倒置原则: 一般来说我们认为作为底层基础框架的逻辑是不应该依赖于上层逻辑的, 所以我们设计软件时也经常是: 需求 - 上层逻辑(直接实现需求) - 发现需要固化的逻辑 - 开发底层模块 - 然后上 ...
- 依赖倒置原则(Dependence Inversion Principle,DIP)
依赖倒转原则就是 A.要依赖于抽象,不要依赖于实现.(Abstractions should not depend upon details. Details should depend upon a ...
- 面象对象设计原则之五:依赖倒置原则(The Dependency Inversion Principle,DIP)
如果说开闭原则是面向对象设计的目标的话,那么依赖倒转原则就是面向对象设计的主要实现机制之一,它是系统抽象化的具体实现.依赖倒转原则是Robert C. Martin在1996年为“C++Reporte ...
- IOS设计模式的六大设计原则之依赖倒置原则(DIP,Dependence Inversion Principle)
定义 高层模块不应该依赖于低层模块,二者都应该依赖于抽象:抽象不应该依赖细节:细节应该依赖抽象. 定义解读 依赖倒置原则在程序编码中经常运用,其核心思想就是面向接口编程,高层模块不应该依赖低层模块(原 ...
- 依赖倒置原则(Dependence Inversion Principle)
目录 背景 说明 例子 "倒置"的解释 总结 参考资料 背景 这几天组内的人一起学习DDD,里面再次提到了依赖倒置原则,在这学习过程中,大家又讨论了一下依赖倒置原则. 说明 采用依 ...
- 设计模式六大原则(三):依赖倒置原则(Dependence Inversion Principle)
依赖倒置原则(DIP)定义: 高层模块不应该依赖低层模块,二者都应该依赖其抽象:抽象不应该依赖细节:细节应该依赖抽象. 问题由来: 类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码 ...
- 3.依赖倒置原则(Dependence Inversion Principle)
1.定义 高层模块不应该依赖于低层模块,二者都应该依赖于抽象:抽象不应该依赖细节:细节应该依赖抽象. 2.定义解读 依赖倒置原则在程序编码中经常运用,其核心思想就是面向接口编程,高层模块不应该依赖低层 ...
- 【设计模式六大原则3】依赖倒置原则(Dependence Inversion Principle)
定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象:抽象不应该依赖细节:细节应该依赖抽象. 问题由来:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成.这种场景下,类 ...
随机推荐
- C++读取txt文件(VS)
最常用的方法?https://www.cnblogs.com/nkzhangcheng/p/7722568.html https://blog.csdn.net/a125930123/article/ ...
- Spring注解:Enable相关注解
@EnableXXX:可以用于取代xml配置中的一些配置,被该注解所标注的类,其中被@Bean标注的方法,一般就用于返回和EnableXXX的XXX相关的Bean,Bean中一般有XXX相关的注解 同 ...
- [vscode] github travis 集成问题
问题log $ npm install -npm ERR! 404 Not Found npm ERR! 404 npm ERR! 404 'types/mocha' is not in the np ...
- EF 热加载 Winform/Asp.net
public partial class Form1 : Form { BackgroundWorker worker = new BackgroundWorker(); xxContext cont ...
- session相关
判断session是否已失效: HttpSession session=request.getSession(false); getSession(boolean)相比于getSession()更安全 ...
- Atcoder Beginner Contest 121D(异或公式)
#include<bits/stdc++.h>using namespace std;int main(){ long long a,b; cin>>a>&g ...
- Linux环境下jdk、tomcat、redis安装及配置
环境说明: linux : centOS jdk : 1.8 tomcat : 8.5 redis : 4.0 jdk安装配置 1.下载jdk(这里下载的是jdk-8u181-linux-x64.ta ...
- Jmeter_实现Excel文件导出到本地
一般而言,对于页面的“导出”操作,主要经历如下两个操作:①根据数据库的内容,将文件导出到应用服务器上:②将服务器上的文件下载到本地电脑: Jmeter同LoadRunner类似,只能记录服务端与客户端 ...
- 【转】C#、面向对象、设计模式学习
源地址:http://www.cnblogs.com/cj723/archive/2007/04/02/697431.html
- vue2.0使用ES6语法
ES6 快速入门 什么是ES6? ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了.Mozilla公司将在这个标准的基础上,推出Java ...