网站首页 > 精选教程 正文
当涉及到软件开发,编写可维护、可扩展和可复用的代码是至关重要的。为了帮助开发人员达到这个目标,我们有七大设计原则,也被称为SOLID原则。这些原则提供了一些指导方针,可以帮助你编写高质量的代码。本文将详细介绍每一个设计原则,并提供相应的Java代码示例。
1.单一职责原则(Single Responsibility Principle - SRP):
单一职责原则要求一个类只应该有一个引起变化的原因。换句话说,一个类应该只有一个职责或功能。这可以提高代码的可维护性和可测试性。
示例代码:
// 不遵循SRP原则
class Employee {
void calculateSalary() {
// 计算工资逻辑
}
void generateReport() {
// 生成报告逻辑
}
}
// 遵循SRP原则
class Employee {
void calculateSalary() {
// 计算工资逻辑
}
}
class ReportGenerator {
void generateReport(Employee employee) {
// 生成报告逻辑
}
}
2.开放-封闭原则(Open-Closed Principle - OCP):
开放-封闭原则强调软件实体(类、模块、函数等)应该对扩展开放,但对修改关闭。意味着可以通过扩展来添加新功能,而不必修改已存在的代码。这样可以避免引入潜在的错误和影响已经测试过的代码。
示例代码:
// 不遵循OCP原则
class Rectangle {
int width;
int height;
}
class AreaCalculator {
int calculateArea(Rectangle rectangle) {
return rectangle.width * rectangle.height;
}
}
// 遵循OCP原则
interface Shape {
int calculateArea();
}
class Rectangle implements Shape {
int width;
int height;
public int calculateArea() {
return width * height;
}
}
3.里氏替换原则(Liskov Substitution Principle - LSP):
里氏替换原则要求派生类必须能够替代其基类,而不引起任何意外的行为变化。换句话说,派生类应该能够完全替代基类,而不会对代码的正确性产生负面影响。
示例代码:
// 不遵循LSP原则
class Bird {
void fly() {
// 飞行逻辑
}
}
class Ostrich extends Bird {
void fly() {
// 鸵鸟不会飞,但覆盖了基类方法
}
}
// 遵循LSP原则
interface Bird {
void move();
}
class Sparrow implements Bird {
void move() {
// 飞行逻辑
}
}
class Ostrich implements Bird {
void move() {
// 鸵鸟走路逻辑,不会飞
}
}
4.接口隔离原则(Interface Segregation Principle - ISP):
接口隔离原则提倡将一个庞大的接口拆分成多个较小的接口,以确保类只需要实现它们所需的方法。这样做可以提高代码的可读性和可维护性,并减少对不需要的方法的依赖。
示例代码:
// 不遵循ISP原则
interface Worker {
void work();
void eat();
}
class Engineer implements Worker {
void work() {
// 工作逻辑
}
void eat() {
// 吃饭逻辑
}
}
// 遵循ISP原则
interface Workable {
void work();
}
interface Eatable {
void eat();
}
class Engineer implements Workable, Eatable {
void work() {
// 工作逻辑
}
void eat() {
// 吃饭逻辑
}
}
5.依赖倒置原则(Dependency Inversion Principle - DIP):
依赖倒置原则要求高层模块不应该依赖于低层模块,两者都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。这种设计可以提高代码的松耦合性和可测试性。
示例代码:
// 不遵循DIP原则
class LightBulb {
void turnOn() {
// 打开灯泡逻辑
}
}
class Switch {
private LightBulb bulb;
Switch() {
bulb = new LightBulb();
}
void operate() {
bulb.turnOn();
}
}
// 遵循DIP原则
interface Switchable {
void turnOn();
}
class LightBulb implements Switchable {
void turnOn() {
// 打开灯泡逻辑
}
}
class Switch {
private Switchable device;
Switch(Switchable device) {
this.device = device;
}
void operate() {
device.turnOn();
}
}
6.迪米特法则(Law of Demeter - LoD):
迪米特法则,也称为最少知识原则,要求一个对象只与直接的朋友通信,减少对象之间的耦合。一个类应该尽可能少地了解其他类的内部细节,只与相关的类交互。
示例代码:
// 不遵循LoD原则
class Team {
private List<Player> players;
Team() {
players = new ArrayList<>();
}
void addPlayer(Player player) {
players.add(player);
}
List<Player> getPlayers() {
return players;
}
}
// 遵循LoD原则
class Team {
private List<Player> players;
Team() {
players = new ArrayList<>();
}
void addPlayer(Player player) {
players.add(player);
}
void printPlayers() {
for (Player player : players) {
System.out.println(player.getName());
}
}
}
7.合成/聚合复用原则(Composite/Aggregate Reuse Principle - CARP):
合成/聚合复用原则强调应优先使用合成/聚合关系(组合关系),而不是继承关系来实现代码的复用。这样可以避免继承的局限性和复杂性。
示例代码:
class Engine {
void start() {
// 引擎启动逻辑
}
}
class Car {
private Engine engine;
Car() {
engine = new Engine();
}
void startCar() {
engine.start();
}
}
以上是Java开发中的七大设计原则的详细介绍,并提供了示例代码。遵循这些原则可以改善代码的质量、可维护性和可扩展性。在实践中,尽量遵循这些原则,根据具体情况适当地应用它们,可以帮助你编写更好的Java代码。
猜你喜欢
- 2024-11-02 Java,设计模式,七大原则,里氏替换原则(LSP),案例
- 2024-11-02 软件设计七大原则,程序员标配(一)
- 2024-11-02 设计模式七大原则 设计模式七大原则包括
- 2024-11-02 Java设计模式的精神领袖:开闭原则
- 2024-11-02 设计模式第2招第3式之命令模式 命令模式定义
- 2024-11-02 Java代码优化六大原则 java代码优化六大原则有哪些
- 2024-11-02 一天一个设计模式——软件架构设计七大原则
- 2024-11-02 专门画了9张图,搞懂设计模式6大原则,这次应该可以了吧
- 2024-11-02 程序员应知道这十大面向对象设计原则
- 2024-11-02 3张图说清楚:java设计模式原则:开闭、接口隔离、迪米特法则
你 发表评论:
欢迎- 04-11Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- 04-11Java中你知道几种从字符串中找指定的字符的数量
- 04-11探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- 04-11Python字符串详解与示例(python字符串的常见操作)
- 04-11java正则-取出指定字符串之间的内容
- 04-11String s1 = new String("abc");这句话创建了几个字符串对象?
- 04-11java判断字符串中是否包含某个字符
- 04-11关于java开发中正确的发牌逻辑编写规范
- 最近发表
-
- Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- Java中你知道几种从字符串中找指定的字符的数量
- 探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- Python字符串详解与示例(python字符串的常见操作)
- java正则-取出指定字符串之间的内容
- String s1 = new String("abc");这句话创建了几个字符串对象?
- java判断字符串中是否包含某个字符
- 关于java开发中正确的发牌逻辑编写规范
- windows、linux如何后台运行jar(并且显示进程名)
- 腾讯大佬私人收藏,GitHub上最受欢迎的100个JAVA库,值得学习
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)