首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
SAAS
ToB门户
了解全球最新的ToB事件
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
微博
Follow
记录
Doing
博客
Blog
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
排行榜
Ranklist
相册
Album
应用中心
qidao123.com技术社区-IT企服评测·应用市场
»
论坛
›
软件与程序人生
›
后端开发
›
Java
›
必知必会的设计原则——依赖倒置原则
返回列表
发新帖
必知必会的设计原则——依赖倒置原则
[复制链接]
发表于 2023-2-8 08:58:50
|
显示全部楼层
|
阅读模式
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
×
概述
开放封闭原则是面向对象的设计的中级目标,而依赖倒置原则是实现开放封闭原则的基础。
如果开放封闭原则是设计大楼的蓝田,那么依赖倒置原则就是大楼的钢铁架构。
高层模块(调用者)不应该依赖于低层模块(被调用者),两个都应该依赖于抽象。依赖倒置原则的本质是通过接口或抽象使各个模块的实现独立,彼此互补影响,从而实现模块间的松耦合。
未使用依赖倒置原则的
代码
/// <summary>
/// 重复
代码
很多, Singer作为高层模块,严重依赖底层模块 不符合依赖倒置原则,开放封闭原则 -单一职责原则
/// </summary>
public class Singer
{
public void SingSong(ChineseSong chineseSong)
{
Console.WriteLine($"歌手正在唱{chineseSong.GetSongWords()}");
}
public void SingSongEnglish(EnglishSong englishSong)
{
Console.WriteLine($"歌手正在唱{englishSong.GetSongWords()}");
}
}
public class ChineseSong
{
public string GetSongWords()
{
return "中国歌曲";
}
}
public class EnglishSong
{
public string GetSongWords()
{
return "外国歌曲";
}
}
复制
代码
//C#控制台调用
Singer singer = new Singer();
singer.SingSong(new ChineseSong());
singer.SingSongEnglish(new EnglishSong());
复制代码
结论:重复代码很多, Singer作为高层模块,严重依赖底层模块 不符合依赖倒置原则,开放封闭原则 -单一职责原则。
面向接口编程的代码
public interface ISongWords
{
public string GetSongWords();
}
public class ChineseSong2: ISongWords
{
public string GetSongWords()
{
return "中国歌曲";
}
}
public class EnglishSong2 : ISongWords
{
public string GetSongWords()
{
return "外国歌曲";
}
}
public class Singer2
{
public void SingSong(ISongWords songWords)
{
Console.WriteLine($"歌手正在唱{songWords.GetSongWords()}");
}
}
复制代码
//C#控制台调用
Singer2 singer2 = new Singer2();
ISongWords songWords = new ChineseSong2();
singer2.SingSong(songWords);
复制代码
依赖倒置原则的代码
抽象不应该依赖细节 细节应该依赖抽象。
public interface ICar
{
void Run();
}
public class Benz : ICar
{
public void Run()
{
Console.WriteLine("奔驰汽车在本跑");
}
}
public class AoDi : ICar
{
public void Run()
{
Console.WriteLine("奥迪汽车在本跑");
}
}
public interface IDriver
{
//在接口或类中 将要注入的服务对象,以参数的形式直接注入,我们称之为接口注入;
void Drive(ICar car);
void Drive();
void SetCar(ICar car);
}
public class Student : IDriver
{
private ICar _car;
/// <summary>
/// 接口注入
/// </summary>
/// <param name="car"></param>
public void Drive(ICar car)
{
car.Run();
}
public void Drive()
{
_car.Run();
}
/// <summary>
/// 属性注入
/// </summary>
/// <param name="car"></param>
public void SetCar(ICar car)
{
_car=car;
}
}
public class Teacher : IDriver
{
private readonly ICar _car;
/// <summary>
/// 构造函数注入
/// </summary>
/// <param name="car"></param>
public Teacher(ICar car)
{
_car = car;
}
public void Drive(ICar car)
{
throw new NotImplementedException();
}
public void SetCar(ICar car)
{
throw new NotImplementedException();
}
public void Drive()
{
_car.Run();
}
}
复制代码
//C#控制台调用
IDriver driver = new Student();
ICar car = new Benz();
driver.Drive(car);
driver.SetCar(car);
driver.Drive();
IDriver driver1 = new Teacher(car);
driver1.Drive(car);
复制代码
总结
以上就是关于依赖倒置原则的内容,有何疑问,欢迎与我沟通交流。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
继续阅读请点击广告
回复
使用道具
举报
返回列表
数据人与超自然意识
+ 我要发帖
×
登录参与点评抽奖,加入IT实名职场社区
去登录
微信订阅号
微信服务号
微信客服(加群)
H5
小程序
快速回复
返回顶部
返回列表