一个高速收费站框架,新增车辆类型(包括是真的新增车辆类型或者同一类型车辆叫法不同)不用修改原有代码,只需要在类上加注解(或注解配合properties配置文件)即可。
\---highway
| Main.java
| MainV2.java
| MainV3.java
| MainV4.java
|
+---annotation
| VehicleType.java
| VehicleTypeV2.java
|
+---config
| VehicleConfig.java
|
+---toll
| TollManager.java
| TollManagerV2.java
| TollManagerV3.java
| TollManagerV4.java
|
\---vehicle
| Bus.java
| Car.java
| NewElectricCar.java
| NewEmergencyVehicle.java
| NewMotorcycle.java
| Truck.java
| Vehicle.java
|
+---v2
| Bus.java
| Car.java
| ElectricCar.java
| EmergencyVehicle.java
| Motorcycle.java
| Truck.java
| Vehicle.java
|
+---v3
| BaseVehicle.java
| Bus.java
| Car.java
| ElectricCar.java
| EmergencyVehicle.java
| Motorcycle.java
| Truck.java
| Vehicle.java
|
\---v4
BaseVehicle.java
Bus.java
Car.java
ElectricCar.java
EmergencyVehicle.java
Motorcycle.java
Truck.java
Vehicle.java
1. 单纯使用注解信息
注解类
在注解类中定义所需要的元素,这里是一个名称列表和每公里收费。
收费管理器类
在收费管理器类中扫描和加载所有带有@VehicleType注解的车辆类,并提供计算收费的方法。在这里获取信息是直接通过注解进行的。
车辆接口
车辆接口,用于提供一个默认方法计算车辆收费。
各种车辆类
只需要在类前加上@VehicleType注解,指定相应值即可,不用侵入原有代码。
主函数
创建TollManager实例进行业务逻辑。
2. 配合properties配置文件
注解类
在注解类中定义所需要的元素,在配合properties配置文件的情况下只需要一个配置文件中的键名。
车辆配置管理类
从配置文件(vehicles.properties)中读取和管理车辆相关的配置信息。
收费管理器类
在收费管理器类中扫描和加载所有带有@VehicleType注解的车辆类,并提供计算收费的方法。在这里获取信息是先拿到注解中的配置文件中的键名,再通过车辆配置管理类提供的方法从配置文件中获取相应的数据。
车辆接口
车辆接口,用于提供一个默认方法计算车辆收费。
各种车辆类
只需要在类前加上@VehicleType注解,指定相应值即可,不用侵入原有代码。
主函数
创建TollManager实例进行业务逻辑。
3. 只用properties配置文件,不用注解
只用properties配置文件唯一的不同就在于,将类的所有信息都放在配置文件中,包括类名,名称,价格等等,只需要从配置文件中读取即可。
4. 使用 Reflections 库
使用reflections库,信息读取的方式变成了使用 Reflections 扫描指定包下的所有 Vehicle 实现类,从实现类中读取信息。
5. 主要区别
用不用配置文件的主要区别就在于注解中信息的多少,你可以把全部信息都放到注解中,也可以只放一个配置文件中的键名。在之后的获取信息步骤,要么通过注解拿到所有信息,要么通过注解中的键名用车辆配置管理类从配置文件(vehicles.properties)中读取和管理车辆相关的配置信息。
使用不同的方法的主要区别就是读取信息方式的不同,单纯用注解就是到注解中获取所需的信息;注解加配置文件就是先从注解中读取键名,再到配置文件中读取其他信息;只用properties配置文件,不用注解就只从配置文件中读取信息;使用 Reflections 库就是使用 Reflections 扫描指定包下的所有 Vehicle 实现类,从实现类中读取信息。