对象的本质是[Map, Dict](Map,%20Dict.md) 面向对象编程(Object-Oriented Programming, OOP): - 特点:基于对象的概念,包括封装、继承和多态。 - 目标:通过抽象和模块化提高代码的复用性和可扩展性。 - 主要贡献:提供了一种将数据和行为组织在一起的方式。 ## 原则 1. 迪米特法则/最少知识原则 1. 最少依赖,一个类中依赖的其他类要尽量少 2. 分层设计 比如 controller service dao 2. 合成/聚合复用原则 - 成员变量实现复用,优先于继承实现复用,本质是:依赖注入的组装优于内部创建对象 3. 继承:里氏代换原则、单一职责原则 - 继承是为了代码复用,实现开闭是利用多态的默认搜索功能去扩展 - 里氏的意思是,要多态的时候父类一定是抽象的空的,如果有具体的功能就会改变父类,导致一些场景把父类换成子类后就不能用了 - 单一的意思是,一个类只负责一个领域的职责 4. 实现:接口隔离原则 5. 开闭原则 6. 依赖倒转 ### 迪米特 类似于不能越级指挥,直接 +3 不会直接调度 +1 去干活,而是让 +2 整体提供一个功能,屏蔽掉 +1 的细节 ```java // 违反迪米特法则的实现 @Service class OrderExportService { public void exportOrders(List<Order> orders) { // 直接访问订单内部的复杂对象结构 for (Order order : orders) { StringBuilder sb = new StringBuilder(); sb.append(order.getUser().getName()) .append(",") .append(order.getUser().getAddress().getProvince()) .append(",") .append(order.getUser().getAddress().getCity()) .append(","); // 直接访问订单项的内部细节 for (OrderItem item : order.getOrderItems()) { sb.append(item.getProduct().getName()) .append(",") .append(item.getProduct().getCategory().getName()) .append(",") .append(item.getQuantity() * item.getProduct().getPrice()); } FileUtils.writeToFile(sb.toString()); // 直接写文件 } } } // 改进后的实现 @Data class Order { private User user; private List<OrderItem> orderItems; // 提供数据导出方法 public OrderExportData toExportData() { return new OrderExportData( user.getDisplayInfo(), orderItems.stream() .map(OrderItem::toExportData) .collect(Collectors.toList()) ); } } @Data class OrderExportData { private String userInfo; private List<OrderItemExportData> items; } @Service class OrderExportService { private final ExportWriter exportWriter; public void exportOrders(List<Order> orders) { List<OrderExportData> exportData = orders.stream() .map(Order::toExportData) .collect(Collectors.toList()); exportWriter.write(exportData); } } ```