网上购物系统的类图构建:面向对象设计原则的实际应用
立即解锁
发布时间: 2024-12-17 11:20:06 阅读量: 60 订阅数: 27 


在线购物系统

参考资源链接:[网上购物系统UML所有图及实验报告](https://wenku.csdn.net/doc/6401acf8cce7214c316edcf4?spm=1055.2635.3001.10343)
# 1. 面向对象设计原则概述
面向对象设计原则(Object-Oriented Design Principles)是构建可维护、可扩展和可复用软件的基础。本章将介绍这些原则的基本概念,并探讨如何通过它们来提高代码质量。
## 1.1 设计原则的重要性
在软件开发中,良好的设计是至关重要的。设计原则提供了一套最佳实践,引导开发者创建出结构清晰、易于理解和修改的代码。面向对象程序设计强调封装、继承和多态,而设计原则进一步指导我们如何利用这些特性。
## 1.2 设计原则的分类
面向对象设计原则大致可以分为两类:
- **基本设计原则**:包括单一职责原则(Single Responsibility Principle, SRP)、开闭原则(Open/Closed Principle, OCP)、里氏替换原则(Liskov Substitution Principle, LSP)等。
- **高级设计原则**:接口隔离原则(Interface Segregation Principle, ISP)、依赖倒置原则(Dependency Inversion Principle, DIP)和合成复用原则(Composite Reuse Principle, CRP)。
这些原则互相补充,共同形成了一套面向对象设计的指导方针。
## 1.3 设计原则的实际应用
将设计原则应用于实际开发中,可以提高软件系统的灵活性和可维护性。例如,通过遵循单一职责原则,可以确保每个类只有一个改变的理由,从而降低系统组件间的耦合度。遵循开闭原则,则意味着软件实体应对扩展开放,对修改关闭,有助于实现软件的持续演进。
接下来的章节,我们将深入探讨这些设计原则,并通过一个网上购物系统的案例来展示它们在实际开发中的运用。
# 2. ```
# 第二章:网上购物系统的需求分析
## 2.1 功能性需求概述
### 2.1.1 用户账户管理
在开发网上购物系统时,用户账户管理是首要考虑的功能性需求。它允许用户创建、更新、删除和管理他们的个人信息。一个健全的账户管理系统通常包含以下特性:
- 注册与验证:用户能够创建账户,并通过电子邮件或手机短信进行验证。
- 登录与登出:用户可以登录系统进行浏览、购买商品,随后安全地登出。
- 密码管理:用户能够修改自己的密码,或在忘记密码时通过安全问题进行密码重置。
- 个人资料管理:用户可以编辑和更新他们的联系信息、偏好设置和个人资料。
- 权限控制:系统需要有角色和权限管理,区分普通用户、管理员等不同权限级别。
开发时需注意的几个要点:
- 确保用户数据的保护,使用加密和安全措施防止未授权访问。
- 界面友好,流程简化,提升用户体验。
- 考虑到移动设备用户的增加,需要有响应式设计,以便在多种设备上都能良好运行。
### 2.1.2 商品浏览与搜索
商品浏览与搜索功能是网上购物系统中最为核心的功能之一。它允许用户搜索特定商品、浏览商品列表以及查看商品详情。为了提高用户满意度和系统效率,应该实现以下几个方面:
- 快速的搜索引擎:能够进行关键词匹配、商品分类过滤和高级搜索。
- 商品详情页面:包括图片、描述、规格参数、库存数量、价格信息和用户评价等。
- 相关商品推荐:根据用户的浏览历史和购买行为推荐相关商品。
- 商品列表:以表格或网格形式展示商品,可以进行排序和筛选。
- 分页机制:当商品数量众多时,需要有有效的分页处理,以提升加载速度。
在具体实现过程中,需要确保搜索引擎的准确性、加载速度和用户界面的友好性。
## 2.2 非功能性需求概述
### 2.2.1 系统性能要求
性能要求决定了系统的响应速度、处理能力和稳定性。对于网上购物系统,以下性能指标尤为重要:
- 响应时间:用户在进行操作(如点击商品链接或搜索)后,系统返回结果的等待时间应尽可能短。
- 吞吐量:在高流量的情况下,系统能够处理的用户请求数量。
- 可用性:系统在任何时间都可被用户访问和使用,即使在维护期间也应尽量减少停机时间。
- 可伸缩性:随着用户数量和交易量的增加,系统能够通过增加资源(如服务器)来提升性能。
为了满足这些性能要求,可能需要进行负载测试、性能调优以及资源优化。
### 2.2.2 安全性与隐私保护
在网上的任何交易过程中,用户数据的安全性和隐私保护是至关重要的。网上购物系统需要特别关注以下几个方面:
- 数据加密:敏感信息,如信用卡信息、个人联系方式等在存储和传输时必须进行加密。
- 认证与授权:用户登录系统时需要进行身份验证,并根据用户的角色和权限进行授权。
- 防止SQL注入和跨站脚本攻击:确保所有的用户输入都经过严格的验证和清洗。
- 日志记录和审计:对用户的操作和系统的行为进行记录,便于安全审计和问题追踪。
- 隐私政策:明确告知用户哪些数据会被收集、使用和共享,并保证用户对自己的数据拥有控制权。
通过实现这些安全措施,可以保护系统不受恶意攻击,并增强用户对系统的信任感。
```
请注意,以上内容根据提供的要求创建了第二章的概要,它包含了功能性需求和非功能性需求的具体分析。在实际撰写文章时,每个部分需要进一步扩展至1000字以上。
# 3. 面向对象设计原则实践
## 3.1 单一职责原则在购物系统中的应用
### 3.1.1 类的设计与分离
在面向对象编程中,单一职责原则(Single Responsibility Principle,SRP)是指导我们设计软件的一种基本规则。它要求一个类应该只有一个引起变化的原因,即只负责一个功能或责任。在我们的网上购物系统中,遵循SRP可以提高系统的可维护性和可复用性。
为了实现SRP,我们需要将类的设计尽可能地细化,使其只处理单一的任务。例如,在用户账户管理模块中,我们将用户验证(登录和注册)、信息修改、密码重置等不同的功能分别由不同的类或方法来处理。这样,当用户验证的逻辑发生变化时,只需要修改与用户验证相关的代码,而不会影响到其他功能。
### 3.1.2 代码示例与解析
下面是一个简单的用户类设计示例,展示了如何将用户的登录和注册功能分离,以遵守SRP。
```java
public class User {
// 用户信息属性
private String username;
private String password;
private String email;
// 用户注册方法
public void register(String username, String password, String email) {
// 注册逻辑
}
// 用户登录方法
public boolean login(String username, String password) {
// 登录逻辑,检查用户名和密码
return true; // 假设登录成功
}
}
// 用户验证服务类
public class UserService {
private User user;
// 使用User类实例进行操作
public UserService() {
this.user = new User();
}
// 调用用户类的注册方法
public void createUserAccount(String username, String password, String email) {
user.register(username, password, email);
}
// 调用用户类的登录方法
public boolean authenticateUser(String username, String password) {
return user.login(username, password);
}
}
```
在上述代码中,`User` 类仅负责用户的基本信息管理与用户账户的创建,而 `UserService` 类负责用户服务的协调,包括调用 `User` 类的注册和登录方法。这样做既保持了 `User` 类的简洁,也使得 `UserService` 可以专注于提供服务层面的逻辑,两者都遵循了单一职责原则。
## 3.2 开闭原则在购物系统中的应用
### 3.2.1 系统扩展性分析
开闭原则(Open-Closed Principle,OCP)规定软件实体应当对扩展开放,对修改关闭。这意味着系统设计应允许在不修改现有代码的情况下,增加新的功能和模块。在实现网上购物系统时,我们应该考虑到系统的未来扩展性。
为了实现OCP,我们需要设计出可扩展的类结构。在购物车管理模块中,我们可以定义一个通用的购物车接口,然后通过不同的实现类来支持不同类型的商品,比如电子商品和实体商品。这样,未来如果添加了新的商品类型,我们只需要添加新的商品类,而不需要修改现有的购物车逻辑。
### 3.2.2 实际案例与实现技巧
下面通过一个简化示例来展示如何应用开闭原则,以实现购物车管理模块的扩展。
```java
public interface ShoppingCart {
void addItem(Item item);
void removeItem(Item item);
double getTotal();
}
public class ElectronicsShoppingCart implements ShoppingCart {
private List<Item> items = new ArrayList<>();
@Override
public void addItem(Item item) {
// 添加电子商品到购物车的逻辑
}
@Override
public void removeItem(Item item) {
// 从购物车中移除电子商品的逻辑
}
@Override
public double getTotal() {
// 计算电子商品购物车总价的逻辑
return 0.0;
}
}
public class PhysicalGoodsShoppingCart implements ShoppingCart {
private List<Item> items = new ArrayList<>();
@Override
public void addItem(Item item) {
// 添加实体商品到购物车的逻辑
}
@Override
public void removeItem(Item item) {
// 从购物车中移除实体商品的逻辑
}
@Override
public double getTotal() {
// 计算实体商品购物车总价的逻辑
return 0.0;
}
}
```
在这个案例中,`ShoppingCart` 是一个抽象接口,定义了购物车的基本操作,如添加商品、移除商品和计算总价。`ElectronicsShoppingCart` 和 `PhysicalGoodsShoppingCart` 是该接口的具体实现类,分别用于处理电子商品和实体商品的购物车逻辑。当我们想要支持新的商品类型时,可以简单地添加一个新的实现了 `ShoppingCart` 接口的类,而无需改动原有的代码逻辑。
## 3.3 里氏替换原则的实现
### 3.3.1 继承关系的设计
里氏替换原则(Liskov Substitution Principle,LSP)指出,在软件中,如果S是T的一个子类型,那么类型为T的对象可以被类型为S的对象替换,而不会影响程序的正确性。为了实现这个原则,我们需要在设计类的继承关系时格外小心。
在购物系统中,比如有一个 `Product` 类,它是一个基类,有 `Book`、`Electronics` 等子类。`Product` 类中有一个方法 `getPrice()` 返回产品的价格。根据LSP,`Book` 和 `Electronics` 都应该重写这个方法,以反映不同的定价策略。
### 3.3.2 代码抽象与多态的应用
下面是一个应用LSP的代码示例,展示了如何通过抽象和多态来维护一致的接口。
```java
public abstract class Product {
protected String name;
protected double price;
public Product(String name, double price) {
this.name = name;
this.price = price;
}
// 获取价格的抽象方法
public abstract double getPrice();
}
public class Book extends Product {
public Book(String name, double price) {
super(name, price);
}
@Override
public double getPrice() {
// 书籍可能会有折扣
return price * 0.9; // 假设9折
}
}
public class Electronics extends Product {
public Electronics(String name, double price) {
super(name, price);
}
@Override
public double getPrice() {
// 电子产品没有折扣
return price;
}
}
public class ShoppingCart {
private List<Product> products = new ArrayList<>();
public void addProduct(Product product) {
products.add(product);
}
public double getTotal() {
double total = 0;
for (Product product : products) {
total += product.getPrice();
}
return total;
}
}
```
在这个例子中,尽管 `Book` 和 `Electronics` 类有不同的价格计算方式,但是它们都遵循了 `Product` 类定义的 `getPrice()` 方法的约定。因此,无论是在 `ShoppingCart` 类中添加书籍还是电子产品到购物车,都能保证一致的行为。当 `getPrice()` 方法被调用时,适当的子类方法会被执行,这就是多态的体现。
通过以上示例,我们可以看到,遵循面向对象设计原则的实践能够使我们的代码更加清晰、可维护和可扩展。在接下来的章节中,我们将继续探讨如何构建网上购物系统的类图,以及如何运用设计模式进一步优化和重构类设计。
# 4. ```
# 第四章:网上购物系统的类图构建
在软件工程中,类图是一种静态结构图,用于展示系统中类的属性、方法以及类之间的各种静态关系,如继承、关联、依赖和聚合等。本章节将详细阐述如何构建网上购物系统的类图,并对核心类的设计、类之间的关系建模以及类图的优化与重构进行深入讨论。
## 4.1 系统核心类的设计
### 4.1.1 用户类与商品类
用户类(User)和商品类(Product)是网上购物系统中最核心的两个类。它们分别代表了购物系统的主体和客体。
#### 用户类(User)
用户类包含用户的基本信息,如用户名、密码、邮箱等,以及一些操作,如登录、注册、管理购物车等。
```java
public class User {
private String username;
private String password;
private String email;
public User(String username, String password, String email) {
this.username = username;
this.password = password;
this.email = email;
}
// Getters and setters for each field
// ...
// Login method
public boolean login(String username, String password) {
// Login logic
return true;
}
// Register method
public boolean register(String username, String password, String email) {
// Registration logic
return true;
}
// Add to cart method
public void addToCart(Product product, int quantity) {
// Add to cart logic
}
}
```
#### 商品类(Product)
商品类包含商品的详细信息,如名称、价格、库存数量、描述和图片等。此外,商品类也可能包含一些业务逻辑,如库存管理、价格计算等。
```java
public class Product {
private String name;
private double price;
private int stock;
private String description;
private String imageUrl;
public Product(String name, double price, int stock, String description, String imageUrl) {
this.name = name;
this.price = price;
this.stock = stock;
this.description = description;
this.imageUrl = imageUrl;
}
// Getters and setters for each field
// ...
// Check stock method
public boolean checkStock(int quantity) {
return this.stock >= quantity;
}
// Update stock method
public void updateStock(int quantity) {
if (checkStock(quantity)) {
this.stock -= quantity;
} else {
throw new OutOfStockException("Not enough stock");
}
}
}
```
### 4.1.2 订单类与支付类
订单类(Order)和支付类(Payment)是网上购物系统中重要的业务类,用于处理购物流程中的订单创建、支付处理以及相关的状态管理。
#### 订单类(Order)
订单类包含订单的详细信息,如订单号、下单时间、订单状态、支付状态以及关联的商品和用户信息。
```java
public class Order {
private String orderId;
private Date orderDate;
private String status;
private String paymentStatus;
private List<Product> products;
private User user;
public Order(String orderId, Date orderDate, String status, String paymentStatus, List<Product> products, User user) {
this.orderId = orderId;
this.orderDate = orderDate;
this.status = status;
this.paymentStatus = paymentStatus;
this.products = products;
this.user = user;
}
// Getters and setters for each field
// ...
// Process payment method
public void processPayment(Payment payment) {
// Payment processing logic
}
// Cancel order method
public void cancelOrder() {
// Cancel order logic
}
}
```
#### 支付类(Payment)
支付类处理与支付相关的信息,如支付方式、支付金额、支付结果等。
```java
public class Payment {
private String paymentMethod;
private double amount;
private String result;
public Payment(String paymentMethod, double amount) {
this.paymentMethod = paymentMethod;
this.amount = amount;
}
// Process payment method
public void processPayment() {
// Payment processing logic
}
// Getters and setters for each field
// ...
}
```
## 4.2 类之间的关系建模
### 4.2.1 关联、聚合与组合
在设计类图时,需要明确类之间的关系。关联表示一个类知道另一个类,而聚合和组合是关联的特殊形式,它们表达了整体和部分的关系。聚合强调的是“拥有”,而组合强调的是“包含”。
#### 关联(Association)
关联关系用来表示一个类和另一个类有关联,通常通过在类中声明一个属性来表达。
```java
public class Cart {
private User user;
// ...
}
```
在上面的例子中,购物车(Cart)类和用户(User)类之间存在关联关系,表示购物车属于某个用户。
#### 聚合(Aggregation)
聚合关系表示类与类之间的整体和部分关系,但部分可以独立于整体存在。
```java
public class Inventory {
private List<Product> products;
// ...
}
```
这里,库存(Inventory)类聚合了商品(Product)类的实例,表示商品可以被存储在库存中,但同时它们也可以独立存在。
#### 组合(Composition)
组合关系类似于聚合,但部分不能独立于整体存在。
```java
public class OrderItem {
private Product product;
private int quantity;
// ...
}
```
订单项(OrderItem)类包含了商品(Product)类的实例和数量,表示每个订单项都包含一定数量的某个商品,商品不能脱离订单项存在。
### 4.2.2 依赖关系的识别与表达
依赖关系是指一个类的方法使用或者创建了另一个类的实例。依赖关系通常用虚线箭头表示,并指向被依赖的类。
```java
public class OrderService {
private PaymentGateway paymentGateway;
public boolean makePayment(Order order, Payment payment) {
return paymentGateway.processPayment(payment);
}
}
```
在这个例子中,订单服务类(OrderService)依赖于支付网关(PaymentGateway)类,因为`makePayment`方法使用了支付网关的实例。
## 4.3 类图的优化与重构
### 4.3.1 设计模式的运用
在类图构建过程中,设计模式的运用可以显著提升系统的可维护性和可扩展性。常用的面向对象设计模式包括工厂模式、单例模式、策略模式和观察者模式等。
#### 单例模式
单例模式确保一个类只有一个实例,并提供一个全局访问点。
```java
public class ShoppingCart {
private static ShoppingCart instance;
private List<Product> products;
private ShoppingCart() {
products = new ArrayList<>();
}
public static ShoppingCart getInstance() {
if (instance == null) {
instance = new ShoppingCart();
}
return instance;
}
public void addProduct(Product product) {
products.add(product);
}
}
```
#### 观察者模式
观察者模式定义了对象之间的一对多依赖关系,当一个对象改变状态时,所有依赖于它的对象都会收到通知并自动更新。
```java
public interface Observer {
void update(Observable observable, Object arg);
}
public class User implements Observer {
private String username;
@Override
public void update(Observable observable, Object arg) {
// Update logic for user
}
}
public class Newsletter implements Observer {
@Override
public void update(Observable observable, Object arg) {
// Update logic for newsletter
}
}
public abstract class Observable {
private List<Observer> observers = new ArrayList<>();
public void addObserver(Observer o) {
observers.add(o);
}
public void deleteObserver(Observer o) {
observers.remove(o);
}
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(this, null);
}
}
}
```
### 4.3.2 类图的持续改进策略
类图构建和优化是一个持续的过程,需要不断地评估和重构类的设计。改进策略包括减少类之间的耦合、提高内聚、移除重复代码、分离关注点以及抽象出共同的职责。
#### 减少类之间的耦合
耦合度是衡量类之间相互依赖程度的指标。降低耦合度可以提高系统的灵活性和可维护性。
```java
public class Product {
// ...
// Instead of having a hard dependency on inventory class
// public Inventory inventory; // Bad design
// Use dependency injection to reduce coupling
// ...
}
```
#### 提高内聚
内聚度是衡量类的职责是否单一的指标。提高内聚度意味着每个类都应该有一个清晰定义的职责。
```java
public class OrderService {
// ...
// Move payment processing to PaymentService for higher cohesion
public boolean processPayment(Order order, PaymentMethod method) {
// ...
}
}
```
## 章节总结
在本章节中,我们深入了解了网上购物系统类图的构建,重点分析了核心类的设计以及类之间关系的建模。我们探讨了关联、聚合与组合的区别和应用场景,以及依赖关系的识别和表达方法。此外,本章还介绍了设计模式在类图优化中的应用,以及实施持续改进策略的方法。通过这些实践,我们能够设计出更加灵活、可扩展和易于维护的系统类图。在下一章中,我们将继续探讨面向对象设计原则的高级应用,包括接口隔离原则、合成复用原则和依赖倒置原则的深入理解与实践。
```
# 5. 面向对象设计原则的高级应用
## 5.1 接口隔离原则与抽象类的运用
接口隔离原则(ISP)的核心在于不应强迫客户依赖于它们不用的方法。这意味着一个类应该只实现它需要的接口。在面向对象编程中,接口是定义行为的地方,而抽象类则可以定义一些基础的实现代码。
### 5.1.1 接口的定义与实现
在设计网上购物系统时,我们可以定义多个接口来满足不同功能模块的需求。例如:
```java
// 用户操作接口
public interface UserOperations {
void register();
void login();
void updateProfile();
}
// 购物车操作接口
public interface ShoppingCartOperations {
void addItem();
void removeItem();
void checkout();
}
```
在实现时,可以有具体的类来实现这些接口:
```java
public class RegularUser implements UserOperations, ShoppingCartOperations {
// 实现用户操作接口方法
public void register() { /* 注册逻辑 */ }
public void login() { /* 登录逻辑 */ }
public void updateProfile() { /* 更新个人资料逻辑 */ }
// 实现购物车操作接口方法
public void addItem() { /* 添加商品到购物车逻辑 */ }
public void removeItem() { /* 从购物车移除商品逻辑 */ }
public void checkout() { /* 结账逻辑 */ }
}
```
### 5.1.2 抽象类与具体类的关系
抽象类可以包含实现代码,提供一些默认行为,使得子类可以覆盖或继承这些行为。例如:
```java
public abstract class User {
protected String name;
protected String email;
// 抽象方法,需要子类实现
public abstract void login();
// 非抽象方法,提供默认实现
public void updateProfile(String newName) {
this.name = newName;
}
}
public class AdminUser extends User {
// 实现抽象方法
public void login() {
// 登录逻辑
}
// 使用继承的非抽象方法
public void updateProfile(String newName) {
// 可以添加一些特殊逻辑,也可以直接使用父类方法
super.updateProfile(newName);
}
}
```
## 5.2 合成复用原则在扩展中的应用
合成复用原则,也称为组合/聚合复用原则,强调优先使用对象组合,而非类继承。通过组合,我们可以实现更灵活的扩展和维护。
### 5.2.1 组件化设计思想
在面向对象设计中,可以将系统划分为若干个组件,每个组件完成特定的功能。通过组合这些组件,可以构建出复杂的系统。
```java
// 组件示例:支付组件
public class PaymentComponent {
public void processPayment(Order order) {
// 支付处理逻辑
}
}
// 组件示例:通知组件
public class NotificationComponent {
public void sendNotification(String message) {
// 发送通知逻辑
}
}
// 主系统使用组件
public class ShoppingCartSystem {
private PaymentComponent paymentComponent;
private NotificationComponent notificationComponent;
public ShoppingCartSystem(PaymentComponent paymentComponent,
NotificationComponent notificationComponent) {
this.paymentComponent = paymentComponent;
this.notificationComponent = notificationComponent;
}
// 购物车系统使用组件进行操作
public void checkout(Order order) {
paymentComponent.processPayment(order);
notificationComponent.sendNotification("Thank you for your purchase!");
}
}
```
### 5.2.2 高内聚与低耦合的实现
内聚是模块内部元素之间联系的紧密程度,耦合是模块之间依赖关系的程度。高内聚、低耦合是良好的设计目标。通过使用接口和组合,我们可以提高系统内各组件的内聚性,同时降低它们之间的耦合度。
```java
// 使用接口定义内聚的组件
public interface IOrderProcessor {
void process(Order order);
}
// 实现内聚组件
public class SimpleOrderProcessor implements IOrderProcessor {
private PaymentComponent paymentComponent;
private NotificationComponent notificationComponent;
public SimpleOrderProcessor(PaymentComponent paymentComponent,
NotificationComponent notificationComponent) {
this.paymentComponent = paymentComponent;
this.notificationComponent = notificationComponent;
}
public void process(Order order) {
paymentComponent.processPayment(order);
notificationComponent.sendNotification("Order processed successfully.");
}
}
```
## 5.3 依赖倒置原则的深入理解
依赖倒置原则(DIP)提出高层模块不应依赖于低层模块,两者都应依赖于抽象。依赖注入是实现依赖倒置的一种常见方法。
### 5.3.1 高层模块与低层模块的依赖反转
在传统的设计中,高层模块会依赖于低层模块。通过依赖倒置,我们可以反转这种依赖关系。
```java
// 高层模块依赖于抽象
public class ReportGenerator {
private IDatabaseManager dbManager;
public ReportGenerator(IDatabaseManager dbManager) {
this.dbManager = dbManager;
}
public void generateReport() {
dbManager.queryData();
// 生成报告逻辑...
}
}
// 低层模块实现抽象
public class MySQLManager implements IDatabaseManager {
public void queryData() {
// MySQL查询逻辑...
}
}
// 客户端代码注入依赖
public class Client {
public static void main(String[] args) {
IDatabaseManager manager = new MySQLManager();
ReportGenerator generator = new ReportGenerator(manager);
generator.generateReport();
}
}
```
### 5.3.2 依赖注入技术的应用案例
依赖注入是一种设计模式,可以减少模块之间的耦合,提高代码的可维护性和可测试性。通过依赖注入,我们可以动态地向一个对象提供其依赖项。
```java
// 通过构造器注入依赖
public class CustomerService {
private ICustomerRepository customerRepository;
public CustomerService(ICustomerRepository customerRepository) {
this.customerRepository = customerRepository;
}
public void addCustomer(Customer customer) {
customerRepository.save(customer);
}
}
// 依赖注入容器(框架)
class IoCContainer {
public static ICustomerRepository getCustomerRepository() {
// 实现选择逻辑
return new JdbcCustomerRepository(); // 或者使用其他的实现
}
}
// 客户端使用依赖注入容器
public class Application {
public static void main(String[] args) {
CustomerService service = new CustomerService(IoCContainer.getCustomerRepository());
service.addCustomer(new Customer("John Doe"));
}
}
```
通过这种方式,我们可以在运行时提供`ICustomerRepository`的不同实现,而不修改`CustomerService`的代码,这提高了系统的灵活性和可维护性。
0
0
复制全文
相关推荐







