用Jara代码模拟实现:旅游出行策略。要求使用配置文件存储具体策略类的类名。在此基础上再增加一种新的旅游出行方式,如徒步旅行 (WalkStrategy)。修改原有类图及代码,注意系统的变化。
时间: 2023-11-28 16:50:35 浏览: 26
首先,我们需要定义一个旅游策略的接口 `TravelStrategy`,并在其中声明一个 `travel()` 方法,用于执行旅游策略。
```java
public interface TravelStrategy {
void travel();
}
```
接下来,我们可以实现两个具体的旅游策略类,分别是 `CarStrategy` 和 `TrainStrategy`。这两个类都实现了 `TravelStrategy` 接口,并分别重写了 `travel()` 方法。
```java
public class CarStrategy implements TravelStrategy {
@Override
public void travel() {
System.out.println("选择了汽车出行方式。");
}
}
public class TrainStrategy implements TravelStrategy {
@Override
public void travel() {
System.out.println("选择了火车出行方式。");
}
}
```
为了让代码更加灵活,我们可以使用配置文件存储具体策略类的类名。在这里,我们使用 `strategies.properties` 文件存储类名信息。
```
car=com.example.CarStrategy
train=com.example.TrainStrategy
```
接下来,我们可以编写一个 `TravelStrategyFactory` 工厂类,用于根据配置文件中的类名创建具体的旅游策略对象。
```java
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class TravelStrategyFactory {
private static Properties properties = new Properties();
static {
InputStream inputStream = TravelStrategyFactory.class.getClassLoader().getResourceAsStream("strategies.properties");
try {
properties.load(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static TravelStrategy getStrategy(String strategyName) {
String className = properties.getProperty(strategyName);
try {
Class<?> clazz = Class.forName(className);
return (TravelStrategy) clazz.newInstance();
} catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) {
e.printStackTrace();
}
return null;
}
}
```
上面的代码中,我们首先读取 `strategies.properties` 文件,然后根据传入的策略名称来获取具体的类名,最后使用反射来创建对应的旅游策略对象。
最后,我们可以编写一个测试类 `TravelTest` 来测试上述代码。
```java
public class TravelTest {
public static void main(String[] args) {
TravelStrategy carStrategy = TravelStrategyFactory.getStrategy("car");
carStrategy.travel();
TravelStrategy trainStrategy = TravelStrategyFactory.getStrategy("train");
trainStrategy.travel();
TravelStrategy walkStrategy = TravelStrategyFactory.getStrategy("walk");
walkStrategy.travel();
}
}
```
上述代码中,我们首先获取 `car` 和 `train` 策略对象,并分别调用它们的 `travel()` 方法。然后,我们尝试获取一个名为 `walk` 的策略对象,但由于我们尚未定义这个策略类,因此会输出错误信息。