请验证我的编程作业是否正确应用了Adapter模式
关于Adapter模式在你的作业中应用的分析
嘿,咱们先来明确一下Adapter模式的核心:它的作用是把一个类的接口转换成客户端期望的另一个接口,解决的是两个已有接口不兼容的问题。结合你的描述,我来帮你拆解当前设计的问题:
你的当前设计角色混淆了
你把Car、Plane、Submarine作为适配器类,用来连接Vehicle超类和PrintStates接口——这其实颠倒了Adapter模式的角色划分:
- 目标接口(Target):应该是
PrintStates(因为你希望这些交通工具能提供“打印状态”的能力) - 适配者(Adaptee):应该是
Vehicle及其子类(Car/Plane/Submarine),也就是本身没有实现PrintStates接口,但拥有自己的状态数据(比如速度、油量、潜深等)的类 - 适配器(Adapter):应该是一个单独的类,它需要同时持有适配者(比如Car的实例),并且实现目标接口
PrintStates,把PrintStates的方法(比如printAllStates())委托给适配者的状态获取方法。
而你现在把Car/Plane/Submarine本身当适配器,相当于让它们既是“被适配的对象”,又是“做适配转换的对象”,这不符合Adapter模式的核心逻辑——Adapter模式的关键是分离适配逻辑和业务对象本身。
两种正确的实现方向
1. 真的需要Adapter模式的场景(比如Vehicle是不可修改的外部类)
如果Vehicle是你无法修改的第三方类,或者出于设计原则不想给它添加PrintStates接口,那正确的做法是:
- 保留
Vehicle、Car、Plane、Submarine作为单纯的业务类,只负责封装自身状态和行为 - 创建单独的适配器类,比如:
同理再写// 目标接口 public interface PrintStates { void printAllStates(); } // Car的适配器 public class CarPrintAdapter implements PrintStates { private Car car; public CarPrintAdapter(Car car) { this.car = car; } @Override public void printAllStates() { System.out.println("Car状态:速度=" + car.getSpeed() + ",油量=" + car.getFuel()); } }PlanePrintAdapter、SubmarinePrintAdapter,这样客户端(你的菜单逻辑)只需要针对PrintStates接口编程,传入对应的适配器实例即可调用打印方法。
2. 不需要Adapter模式的场景(Vehicle是你自己可控的代码)
如果Vehicle是你自己编写的类,完全可以直接让它实现PrintStates接口,或者在子类中重写打印方法:
public abstract class Vehicle implements PrintStates { // 通用属性和方法 } public class Car extends Vehicle { @Override public void printAllStates() { // 打印Car的专属状态 } }
这种情况下根本不需要Adapter模式,因为不存在接口不兼容的问题,直接让业务类实现目标接口更简单直接。
结合你的程序功能
你的菜单逻辑需要根据用户输入展示对应对象的状态,用上面两种正确的方式,都能很好地实现:
- 用户输入P/C/S时,要么创建对应交通工具的适配器实例,要么直接创建对应交通工具实例,调用
printAllStates()方法 - 输入B时展示历史选择,这个逻辑和Adapter模式无关,正常维护一个历史列表即可
总结一下:你当前的设计没有正确应用Adapter模式,核心问题是把业务对象和适配器角色混在了一起。根据你的实际场景选择上面两种方向之一,就能符合设计模式的要求啦~
内容的提问来源于stack exchange,提问作者molamola
相关产品推荐
相关产品推荐

