面试题答案
一键面试商品展示模块
- 运用抽象类:可以创建一个抽象商品类,例如
AbstractProduct
,包含商品通用属性如名称、价格、描述等,以及一些通用行为的抽象方法,如getDetails()
。具体商品如BookProduct
、ClothesProduct
继承自AbstractProduct
,实现getDetails()
方法,这样每个具体商品类专注于自身特性,实现高内聚。不同商品类之间通过继承抽象类解耦,达到低耦合。 - 运用接口:定义如
Displayable
接口,包含display()
方法。商品类实现该接口,以统一方式进行展示。这使得展示逻辑可以脱离具体商品类独立变化,实现低耦合。同时,商品类实现该接口专注于自身展示逻辑实现,达到高内聚。
订单处理模块
- 运用抽象类:创建
AbstractOrder
抽象类,包含订单通用属性如订单号、下单时间、顾客信息等,以及抽象的订单处理方法,如processOrder()
。具体订单类型如NormalOrder
、PromotionOrder
继承自AbstractOrder
并实现processOrder()
方法,实现订单处理逻辑的高内聚。不同订单类型通过继承抽象类解耦,降低耦合度。 - 运用接口:定义
PaymentProcessor
接口,包含processPayment()
方法。订单处理类通过依赖该接口来处理支付,这样支付逻辑可以独立于订单处理类变化,实现低耦合。订单处理类专注于订单相关逻辑和调用支付接口,达到高内聚。
用户权限管理模块
- 运用抽象类:创建
AbstractUser
抽象类,包含用户通用属性如用户名、密码等,以及抽象的权限判断方法,如hasPermission(String permission)
。不同用户角色类如AdminUser
、NormalUser
继承自AbstractUser
并实现hasPermission
方法,实现用户权限管理逻辑的高内聚。不同用户角色类通过继承抽象类解耦,降低耦合度。 - 运用接口:定义
PermissionChecker
接口,包含checkPermission(User user, String permission)
方法。权限管理类依赖该接口进行权限检查,使得权限检查逻辑可以独立于具体用户角色变化,实现低耦合。权限管理类专注于调用权限检查接口等相关逻辑,达到高内聚。
抽象类和接口的设计原则体现
- 单一职责原则:抽象类和接口都促使每个类或模块专注于单一职责。例如商品展示模块中,
AbstractProduct
专注于商品通用属性和行为抽象,Displayable
接口专注于展示行为定义。 - 开闭原则:通过抽象类和接口,系统对扩展开放,对修改关闭。例如增加新商品类型只需继承
AbstractProduct
并实现相关方法,而不影响现有商品类;增加新支付方式只需实现PaymentProcessor
接口,不影响订单处理类。 - 依赖倒置原则:模块依赖于抽象(抽象类或接口)而非具体实现。如订单处理类依赖
PaymentProcessor
接口,而不是具体支付实现类,降低了模块间耦合。
可能面临的挑战和解决方案
- 挑战:
- 抽象层次难以把握:抽象度过高,可能导致抽象类或接口过于通用,失去实际意义;抽象度过低,又无法充分发挥解耦优势。
- 多重继承问题(接口方面):一个类可以实现多个接口,如果接口方法命名冲突或语义相近,会增加维护难度。
- 版本兼容性:修改抽象类或接口可能影响所有实现类,导致兼容性问题。
- 解决方案:
- 抽象层次把控:在设计初期充分分析业务需求,结合领域知识,确定合适抽象层次。同时,在开发过程中持续优化抽象设计。
- 多重继承问题:规范接口命名,确保接口语义清晰明确。若出现命名冲突,可通过接口方法默认实现或委托模式解决。
- 版本兼容性:采用版本控制策略,在修改抽象类或接口时,通过兼容性设计(如新增方法提供默认实现)确保现有实现类不受影响,同时为新功能提供扩展点。