面试题答案
一键面试1. 策略模式与依赖注入结合
- 实现方式:
- 首先定义策略接口及其具体实现类。例如,假设有一个支付策略接口
PaymentStrategy
,以及具体的AlipayPayment
和WechatPayment
实现类。
public interface PaymentStrategy { void pay(double amount); } public class AlipayPayment implements PaymentStrategy { @Override public void pay(double amount) { System.out.println("使用支付宝支付:" + amount + "元"); } } public class WechatPayment implements PaymentStrategy { @Override public void pay(double amount) { System.out.println("使用微信支付:" + amount + "元"); } }
- 然后,在需要使用支付策略的服务类中,通过依赖注入的方式注入具体的支付策略。
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class OrderService { private PaymentStrategy paymentStrategy; @Autowired public OrderService(PaymentStrategy paymentStrategy) { this.paymentStrategy = paymentStrategy; } public void placeOrder(double amount) { System.out.println("下单成功,准备支付..."); paymentStrategy.pay(amount); } }
- 在Spring配置文件(或使用注解配置)中,配置具体的支付策略实例。
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class AppConfig { @Bean public PaymentStrategy alipayPayment() { return new AlipayPayment(); } @Bean public PaymentStrategy wechatPayment() { return new WechatPayment(); } }
- 首先定义策略接口及其具体实现类。例如,假设有一个支付策略接口
- 优势:
- 灵活性:可以根据不同的业务需求,轻松切换支付策略,例如在不同的业务场景中使用支付宝或微信支付。
- 可维护性:每个支付策略都独立实现,代码结构清晰,易于维护和扩展。如果需要添加新的支付方式,只需要创建新的实现类并配置为Spring Bean即可。
- 可能遇到的问题及解决方案:
- 策略选择问题:可能不知道在特定场景下该选择哪个具体策略。解决方案是可以在系统中增加策略选择逻辑,例如通过配置文件或在业务逻辑中根据用户选择、业务规则等动态决定使用哪个策略。
2. 策略模式与AOP结合
- 实现方式:
- 假设在支付策略执行前后需要记录日志,使用AOP来实现。首先定义一个切面类。
import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; @Aspect @Component public class PaymentAspect { @Around("execution(* com.example.demo.PaymentStrategy.pay(..))") public Object logPayment(ProceedingJoinPoint joinPoint) throws Throwable { System.out.println("开始支付..."); Object result = joinPoint.proceed(); System.out.println("支付完成。"); return result; } }
- 优势:
- 代码复用:将通用的横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,提高代码的复用性。在不同的策略实现类中都可以复用这个切面逻辑。
- 业务逻辑简洁:业务类只专注于核心业务逻辑,如支付的具体实现,而不需要关注日志记录等非核心功能,使代码更加简洁清晰。
- 可能遇到的问题及解决方案:
- 性能问题:过多的切面可能会影响系统性能。解决方案是合理设计切面,避免不必要的切面操作,并且可以使用性能监控工具来定位性能瓶颈并进行优化。
- 切面冲突:多个切面可能在同一个连接点上产生冲突。解决方案是合理安排切面的优先级,通过
@Order
注解等方式来指定切面执行顺序。
3. 综合结合的优势
- 整体灵活性:通过依赖注入选择不同的策略,AOP实现通用横切逻辑,使整个业务逻辑更加灵活,能快速适应业务变化。
- 代码结构清晰:策略模式实现业务逻辑的分离,依赖注入管理对象依赖,AOP处理横切关注点,使得代码结构清晰,易于理解和维护。
4. 综合结合可能遇到的问题及解决方案
- 配置复杂:随着策略和切面的增多,配置可能变得复杂。解决方案是使用合理的配置管理方式,如将相关配置集中管理,使用注释清晰地说明每个配置的作用。
- 调试困难:由于涉及多种技术结合,调试可能会变得困难。解决方案是使用合适的调试工具,如IDE的调试功能,结合日志输出,逐步定位问题所在。