面试题答案
一键面试接口隔离原则简述
接口隔离原则(ISP)强调客户端不应该依赖它不需要的接口。在模块化设计中,这意味着每个模块应该只依赖于它实际需要的接口,避免依赖臃肿的通用接口。
电商系统模块化设计思路
- 商品展示模块:此模块主要负责展示商品信息,可能需要获取商品数据的接口。
- 购物车模块:负责管理用户购物车,需要添加商品、删除商品、计算总价等接口。
- 订单处理模块:处理订单创建、支付、订单状态更新等操作,需要相应的接口。
代码示例
- 定义接口
// 商品数据获取接口
export interface IProductDataProvider {
getProductById(id: number): Promise<any>;
}
// 购物车操作接口
export interface ICartOperations {
addProductToCart(product: any): void;
removeProductFromCart(productId: number): void;
calculateCartTotal(): number;
}
// 订单处理接口
export interface IOrderProcessor {
createOrder(cartItems: any[]): Promise<any>;
processPayment(order: any): Promise<void>;
updateOrderStatus(orderId: number, status: string): Promise<void>;
}
- 实现模块
// 商品展示模块实现
class ProductDisplayModule {
private productDataProvider: IProductDataProvider;
constructor(provider: IProductDataProvider) {
this.productDataProvider = provider;
}
async displayProduct(id: number) {
const product = await this.productDataProvider.getProductById(id);
// 展示商品逻辑
}
}
// 购物车模块实现
class CartModule implements ICartOperations {
private cart: any[] = [];
addProductToCart(product: any) {
this.cart.push(product);
}
removeProductFromCart(productId: number) {
this.cart = this.cart.filter(item => item.id!== productId);
}
calculateCartTotal() {
return this.cart.reduce((total, item) => total + item.price, 0);
}
}
// 订单处理模块实现
class OrderProcessingModule implements IOrderProcessor {
async createOrder(cartItems: any[]) {
// 创建订单逻辑
const order = { items: cartItems, status: 'pending' };
return order;
}
async processPayment(order: any) {
// 支付处理逻辑
console.log('Payment processed for order', order);
}
async updateOrderStatus(orderId: number, status: string) {
// 更新订单状态逻辑
console.log('Order status updated to', status, 'for order', orderId);
}
}
- 使用模块
// 示例使用
async function main() {
// 假设CartModule也实现了IProductDataProvider接口
const cartModule = new CartModule();
const productDisplay = new ProductDisplayModule(cartModule as IProductDataProvider);
await productDisplay.displayProduct(1);
const orderProcessor = new OrderProcessingModule();
const order = await orderProcessor.createOrder(cartModule.cart);
await orderProcessor.processPayment(order);
await orderProcessor.updateOrderStatus(1, 'completed');
}
main();
通过这种方式,每个模块都只依赖于其所需的接口,使得模块之间的耦合度降低,提高了代码的可维护性和可扩展性。当某个模块的功能发生变化时,只要接口不变,其他模块不受影响。