当前位置: 首页 > news >正文

Java 面向对象设计的六大原则

Java 面向对象设计的六大原则及示例

摘要

在大型 Java 项目中,代码的可维护性、可扩展性与复用性至关重要。
六大设计原则是面向对象设计的“金科玉律”,帮助开发者在需求变化时写出更稳健、易维护的代码。
本文将逐一介绍这六大原则,并提供简明 Java 示例。


1. 单一职责原则(Single Responsibility Principle)

一个类只做一件事。

  • 含义:一个类应该只有一个引起它变化的原因。
  • 好处:修改风险小,职责清晰。

示例:

// 只负责用户业务
public class UserService {public void createUser(String name) {System.out.println("Create user: " + name);}
}// 只负责日志记录
public class LogService {public void log(String msg) {System.out.println("[LOG] " + msg);}
}

2. 开闭原则(Open/Closed Principle)

对扩展开放,对修改关闭。

  • 含义:新增功能时尽量通过扩展而非修改已有类。
  • 好处:降低修改旧代码带来的风险。

示例:策略模式扩展支付方式

interface PaymentStrategy { void pay(double amount); }class Alipay implements PaymentStrategy {public void pay(double amount) { System.out.println("Alipay pay: " + amount); }
}class WeChatPay implements PaymentStrategy {public void pay(double amount) { System.out.println("WeChat pay: " + amount); }
}class PaymentService {private final PaymentStrategy strategy;public PaymentService(PaymentStrategy strategy) { this.strategy = strategy; }public void checkout(double amt) { strategy.pay(amt); }
}

新增支付方式只需实现 PaymentStrategy 接口。


3. 里氏替换原则(Liskov Substitution Principle)

子类必须能够替换父类出现的地方,并保持行为正确。

  • 核心:遵守继承契约,避免破坏父类逻辑。
class Bird {public void fly() { System.out.println("I can fly"); }
}class Sparrow extends Bird {@Overridepublic void fly() { System.out.println("Sparrow flies swiftly"); }
}// 使用
Bird b = new Sparrow();
b.fly();

如果某个子类(如企鹅)不能飞,就不该继承 Bird,可以使用接口或组合代替。


4. 依赖倒置原则(Dependency Inversion Principle)

高层模块不依赖低层模块,两者都依赖抽象。

  • 核心:面向接口编程,而不是面向实现。
interface UserRepository { void save(String user); }class JdbcUserRepository implements UserRepository {public void save(String user) { System.out.println("Save user: " + user); }
}class UserController {private final UserRepository repo;public UserController(UserRepository repo) { this.repo = repo; }public void register(String name) { repo.save(name); }
}

通过构造注入不同实现即可替换存储方式。


5. 接口隔离原则(Interface Segregation Principle)

客户端不应被迫依赖不需要的方法。

  • 做法:多个小接口优于一个臃肿接口。
interface Flyable { void fly(); }
interface Swimmable { void swim(); }class Duck implements Flyable, Swimmable {public void fly() { System.out.println("Duck flies"); }public void swim() { System.out.println("Duck swims"); }
}class Fish implements Swimmable {public void swim() { System.out.println("Fish swims"); }
}

6. 迪米特法则(Law of Demeter / 最少知道原则)

一个对象应尽量少地了解其他对象的内部细节。

  • 要点:只与“直接朋友”通信,避免过度依赖。
class Engine {void start() { System.out.println("Engine start"); }
}class Car {private final Engine engine = new Engine();public void start() { engine.start(); } // 封装细节
}class Driver {public void drive(Car car) {car.start();  // 不去 car.getEngine().start()}
}

总结

原则关键词作用
单一职责一类一事减少修改风险
开闭扩展不修改适应需求变化
里氏替换子可替父保持继承体系稳定
依赖倒置依赖抽象降低耦合
接口隔离小而专提高灵活性
迪米特少知道减少依赖链

遵循这些原则,能让 Java 项目更易维护、更具扩展性,也为后续引入设计模式打下坚实基础。
实际开发中不必生搬硬套,而是灵活运用:当你发现类职责过多、接口过于庞大、或者修改牵一发而动全身时,就是这些原则出手的好时机。


文章转载自:

http://RZUPFFbk.mcjrf.cn
http://lgUUQ6SE.mcjrf.cn
http://4arGPHJl.mcjrf.cn
http://SQvWP6BV.mcjrf.cn
http://pkRAX2me.mcjrf.cn
http://blmGiJj7.mcjrf.cn
http://YwaP1t0Z.mcjrf.cn
http://Cxbo4GUf.mcjrf.cn
http://WtRfw8xr.mcjrf.cn
http://SG61yrmR.mcjrf.cn
http://c2J6FiHD.mcjrf.cn
http://Cltwr6Sp.mcjrf.cn
http://peyS3V5t.mcjrf.cn
http://kSfgFuRf.mcjrf.cn
http://I8BJNCDr.mcjrf.cn
http://UnQauEz5.mcjrf.cn
http://iH6z3fLi.mcjrf.cn
http://nnv2939E.mcjrf.cn
http://wGP7QBRz.mcjrf.cn
http://2Vv2DVsp.mcjrf.cn
http://n9SzOdGl.mcjrf.cn
http://GOC83Sxb.mcjrf.cn
http://elTObKdY.mcjrf.cn
http://ARqTOPqU.mcjrf.cn
http://oQxGum75.mcjrf.cn
http://mvYEy75P.mcjrf.cn
http://3pcom0UY.mcjrf.cn
http://VdB1SMCr.mcjrf.cn
http://2L0FM1Uv.mcjrf.cn
http://YfNPx3Pr.mcjrf.cn
http://www.dtcms.com/a/382264.html

相关文章:

  • 今日分享:C++ deque与priority_queue
  • Vue3 通过json配置生成查询表单
  • spring 声明式事务
  • [硬件电路-190]:三极管的电流放大特性看男女关系3:过渡的投入,输出进入不安全区、疲惫期,反而双方系统造成伤害
  • json文件转excel
  • ros2获取topic信息解析
  • C++中的贪心算法
  • 【Selenium】Selenium 测试失败排查:一次元素定位超时的完整解决之旅
  • Selenium 使用指南
  • 【Python 入门】(2)Python 语言基础(变量)
  • XSS攻击1----(XSS介绍)
  • 【LeetCode 每日一题】3446. 按对角线进行矩阵排序——(解法一)分组 - 排序 - 重建
  • 【亲测有效】解决 “Batch script contains DOS line breaks (\r\n)” 报错
  • 集值优化问题:理论、应用与前沿进展
  • 17、逻辑回归与分类评估 - 从连续到离散的智能判断
  • AMD KFD的BO设计分析系列3-1: GTT的实现分析
  • 如何实现静态库与动态库的制作
  • 【硬件开发】电源抑制比PSRR
  • 基于Redisson的分布式锁原理深度解析与性能优化实践指南
  • 【Leetcode hot 100】101.对称二叉树
  • 破解多校区高校运维困局,协同效率提升60%的智能运维方案
  • 王道计算机组成原理 学习笔记
  • Matplotlib:绘制你的第一张折线图与散点图
  • 即梦批量生成图片软件使用运营大管家-即梦图片批量生成器
  • Qt中解析JSON文件
  • 从静态表查询冲突到其原理
  • Git 版本回退与撤销修改
  • Tcpdump: The Basics Tcpdump 基础
  • 智慧物联网水利大数据平台建设方案PPT(70页)
  • 字典树初步