对象的本质是[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);
}
}
```