内容来自samhan666
SOLID 原则对于任何旨在构建健壮、可维护系统的开发人员来说都是基础。这些原则不仅提高了代码质量,而且促进了项目的团队合作和可扩展性。让我们通过 Java 中的实际示例研究这些原则,重点介绍常见违规行为和推荐做法。
1.单一职责原则(SRP)
原则:一个类应该只有一个改变的理由。 内容来自samhan
违反建议零售价: 内容来自samhan
1 内容来自samhan666
2
内容来自samhan666
3
4
5 zvvq好,好zvvq
6
内容来自zvvq
7
本文来自zvvq
8 zvvq好,好zvvq
9
10 内容来自zvvq,别采集哟
11
zvvq好,好zvvq
12
公开课用户{
私有字符串名称;
内容来自zvvq,别采集哟
私人字符串电子邮件;
zvvq好,好zvvq
公共无效保存用户{
zvvq
// 将用户保存到数据库的逻辑
zvvq.cn
}
公共无效发送电子邮件{
// 向用户发送电子邮件的逻辑
}
zvvq.cn
} copyright zvvq
在此示例中,User 类具有多个职责:管理用户数据和发送电子邮件。 copyright zvvq
应用建议零售价:
copyright zvvq
1 内容来自zvvq
2
内容来自samhan
3
zvvq
4
5
zvvq.cn
6 zvvq好,好zvvq
7 zvvq.cn
8 内容来自zvvq
9
zvvq好,好zvvq
10 zvvq.cn
11
12
13 zvvq好,好zvvq
14
内容来自samhan
15 本文来自zvvq
16 本文来自zvvq
公开课用户{ 本文来自zvvq
私有字符串名称; 内容来自samhan666
私人字符串电子邮件;
} 内容来自zvvq
公共类用户存储库{
内容来自samhan666
公共无效保存用户(用户用户){
内容来自zvvq
// 将用户保存到数据库的逻辑
}
内容来自zvvq
} zvvq.cn
公共类电子邮件服务{ zvvq
公共无效sendEmail(用户用户){
// 向用户发送电子邮件的逻辑 本文来自zvvq
} 内容来自samhan
} zvvq
在这里,我们将职责划分为不同的类别,遵循 SRP。 本文来自zvvq
2. 开闭原理(OCP)
原则:类应该对扩展开放,对修改关闭。
copyright zvvq
违反 OCP:
内容来自samhan666
1 内容来自zvvq,别采集哟
2
zvvq.cn
3
4 内容来自zvvq,别采集哟
5 内容来自zvvq,别采集哟
6
内容来自zvvq,别采集哟
7 内容来自samhan666
8
9 zvvq好,好zvvq
10 本文来自zvvq
公共课折扣计算器 { 内容来自samhan666
公共双计算折扣(字符串类型){ 内容来自samhan
if (type.equals("NORMAL")) { 内容来自zvvq
返回0.05; zvvq.cn
} else if (type.equals("SPECIAL")) { 内容来自zvvq
返回0.1;
本文来自zvvq
}
返回0; zvvq.cn
} zvvq.cn
}
在此示例中,任何新的折扣类型都需要修改 DiscountCalculator 类。 zvvq
应用 OCP: 内容来自zvvq,别采集哟
1 zvvq.cn
2
zvvq好,好zvvq
3 zvvq好,好zvvq
4
zvvq.cn
5 内容来自samhan
6 内容来自samhan
7
8 copyright zvvq
9 内容来自zvvq,别采集哟
10
内容来自zvvq,别采集哟
11
内容来自samhan666
12 内容来自zvvq
13
copyright zvvq
14 内容来自samhan
15 copyright zvvq
16 zvvq好,好zvvq
17 zvvq.cn
18 zvvq
19 内容来自zvvq
20 zvvq
21 zvvq
公共接口折扣 { 内容来自samhan666
双计算折扣;
本文来自zvvq
} 内容来自zvvq,别采集哟
公共类 NormalDiscount 实现 Discount { 内容来自zvvq,别采集哟
公共双计算折扣{
返回0.05;
} zvvq好,好zvvq
}
公共类 SpecialDiscount 实现 Discount { 本文来自zvvq
公共双计算折扣{
内容来自samhan666
返回0.1; 内容来自samhan
}
内容来自zvvq,别采集哟
}
公共类折扣计算器{
公共双计算折扣(折扣折扣){ 内容来自zvvq,别采集哟
返回折扣.calculateDiscount(); 内容来自zvvq
}
} 本文来自zvvq
在这种情况下,DiscountCalculator 关闭以进行修改,但可以通过实施新的折扣类型进行扩展。 内容来自samhan666
3.里氏替换原理(LSP)
原则:子类应该可以被基类替换,而不影响程序的正确性。
copyright zvvq
违反LSP: 内容来自zvvq,别采集哟
1
2
3 内容来自zvvq,别采集哟
4 内容来自zvvq
5 内容来自zvvq,别采集哟
6
7
8 zvvq.cn
9 copyright zvvq
10 内容来自zvvq,别采集哟
11
12 zvvq
公开课鸟{ 本文来自zvvq
公共无效飞行{
zvvq好,好zvvq
// 飞行实现 zvvq好,好zvvq
} 内容来自zvvq,别采集哟
} 内容来自zvvq,别采集哟
公共类企鹅扩展了鸟{ 内容来自zvvq,别采集哟
@覆盖 copyright zvvq
公共无效飞行{ zvvq.cn
throw new UnsupportedOperationException("企鹅不会飞"); copyright zvvq
}
内容来自samhan
} zvvq.cn
这里,Penguin类不能代替Bird而不影响程序的正确性。
内容来自samhan
应用 LSP: zvvq.cn
1 内容来自zvvq
2 内容来自samhan666
3
内容来自zvvq,别采集哟
4 内容来自zvvq
5
6
7
内容来自zvvq,别采集哟
8
本文来自zvvq
9 zvvq好,好zvvq
10
本文来自zvvq
11 内容来自samhan
公共抽象类 Bird {
} 内容来自zvvq,别采集哟
公共类 FlyingBird 扩展 Bird {
copyright zvvq
公共无效飞行{ 内容来自zvvq,别采集哟
// 飞行实现
}
zvvq.cn
}
zvvq好,好zvvq
公共类企鹅扩展了鸟{
内容来自samhan
} 本文来自zvvq
现在,FlyingBird 和 Penguin 分开了,尊重 Bird 被其子类取代的能力。
4. 接口隔离原则(ISP)
原则:不应该强迫客户端依赖他们不使用的接口。
违反ISP: 内容来自zvvq,别采集哟
1 内容来自zvvq,别采集哟
2
zvvq好,好zvvq
3
4
5 内容来自samhan
6
7 copyright zvvq
8
9 内容来自samhan
10 zvvq
11
12
13
14 内容来自zvvq
15 内容来自zvvq
16
copyright zvvq
17 copyright zvvq
18 内容来自samhan666
19 zvvq
公共界面动物{
内容来自samhan666
无效步行; 内容来自zvvq,别采集哟
无效飞行; 内容来自samhan
无效游泳;
}
内容来自zvvq,别采集哟
公共类 Dog 实现 Animal {
内容来自samhan
公共无效步行{
// 步行实现 内容来自zvvq,别采集哟
}
内容来自zvvq,别采集哟
公共无效飞行{ 内容来自samhan
抛出新的 UnsupportedOperationException();
zvvq好,好zvvq
}
本文来自zvvq
公共无效游泳{
// 狗会游泳 内容来自samhan
} 内容来自zvvq
} zvvq.cn
这里,Dog被迫实现fly,这是不相关的。 内容来自zvvq,别采集哟
应用ISP:
1
copyright zvvq
2 内容来自zvvq
3 内容来自samhan
4 zvvq好,好zvvq
5 本文来自zvvq
6
内容来自samhan
7 内容来自zvvq
8 内容来自samhan
9
本文来自zvvq
10
zvvq
11 zvvq好,好zvvq
12
内容来自samhan666
13
14 zvvq.cn
15 zvvq好,好zvvq
16
17
18
19
20
zvvq.cn
21
公共界面步行{ 内容来自samhan
无效步行; 内容来自samhan666
}
公共接口可飞{ zvvq好,好zvvq
无效飞行; 内容来自samhan
} 内容来自zvvq
公共接口可游泳{
内容来自samhan666
无效游泳; zvvq
} 本文来自zvvq
公共类 Dog 实现 Walkable、Swimmable {
copyright zvvq
公共无效步行{ 内容来自samhan
// 步行实现
} copyright zvvq
公共无效游泳{ 内容来自zvvq,别采集哟
// 游泳实现
}
}
现在,Dog 只实现与其动作相关的接口。 内容来自zvvq
5. 依赖倒置原则(DIP)
原则:高层模块不应该依赖于低层模块。两者都应该依赖于抽象。
内容来自samhan
违反 DIP:
1
内容来自zvvq,别采集哟
2 zvvq好,好zvvq
3
本文来自zvvq
4 内容来自samhan
5
copyright zvvq
6
内容来自samhan666
7 zvvq好,好zvvq
8
内容来自zvvq
9 内容来自samhan
10
11
本文来自zvvq
12
zvvq
13 内容来自zvvq
公共课灯泡{ 内容来自samhan
公共无效打开{
// 打开灯泡
}
}
公共类电力开关{ 内容来自samhan
私有 LightBulb lightBulb = new LightBulb(); zvvq.cn
公共无效按下{ 内容来自zvvq,别采集哟
灯泡.turnOn(); 内容来自samhan
} 内容来自samhan666
}
zvvq
ElectricPowerSwitch 直接依赖于 LightBulb,一个低级模块。
应用 DIP: 内容来自zvvq
1
zvvq好,好zvvq
2
3 本文来自zvvq
4
zvvq
5
6 内容来自zvvq
7 本文来自zvvq
8 内容来自samhan
9
10
11 zvvq.cn
12
13 内容来自samhan
14
本文来自zvvq
15 内容来自samhan
16 zvvq
17
18
19 本文来自zvvq
20 内容来自zvvq
21
内容来自zvvq,别采集哟
公共界面可切换{
内容来自samhan666
无效打开;
copyright zvvq
}
zvvq好,好zvvq
公共类 LightBulb 实现可切换 { 内容来自zvvq
公共无效打开{ copyright zvvq
// 打开灯泡
} 内容来自zvvq
} 内容来自zvvq,别采集哟
公共类电力开关{
本文来自zvvq
私人可切换客户端;
内容来自samhan
公共 ElectricPowerSwitch(可切换客户端){
内容来自zvvq
this.client = 客户端; zvvq.cn
} 本文来自zvvq
公共无效按下{ zvvq.cn
客户端.turnOn(); 内容来自zvvq,别采集哟
}
}
现在,ElectricPowerSwitch 依赖于一个抽象(Switchable),这使得设计更加灵活和可持续。
结论 copyright zvvq
在 Java 中应用 SOLID 原则不仅是良好的理论实践,而且是保持软件灵活性、可持续性和可理解性的行之有效的策略。我希望这些示例有助于说明如何在自己的软件项目中实现这些原则。以上就是掌握 Java 的 SOLID 原则:实用指南的详细内容,更多请关注其它相关文章! 内容来自zvvq