java mvc框架 controller getMapping 使用策略模式代替if-else根据手机号调用其他实现类查询不同信息添加到model中返回不同页面,写一个例子
时间: 2023-08-31 13:24:41 浏览: 65
### 回答1:
好的,下面是使用策略模式重构 Java MVC 框架的控制器中的 getMapping 方法的范例代码:
首先,我们定义一个策略接口 PhoneInfoStrategy,其实现类可以根据不同的手机号码查询不同的信息:
```
public interface PhoneInfoStrategy {
void setPhone(String phone);
void addModelAttributes(Model model);
}
```
然后,我们针对不同的手机号码,创建对应的实现类:
```
public class ChinaMobileStrategy implements PhoneInfoStrategy {
private String phone;
@Override
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public void addModelAttributes(Model model) {
// China Mobile specific implementation
model.addAttribute("user", "China Mobile User");
model.addAttribute("phone", phone);
model.addAttribute("location", "China");
}
}
public class ChinaUnicomStrategy implements PhoneInfoStrategy {
private String phone;
@Override
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public void addModelAttributes(Model model) {
// China Unicom specific implementation
model.addAttribute("user", "China Unicom User");
model.addAttribute("phone", phone);
model.addAttribute("location", "China");
}
}
public class ChinaTelecomStrategy implements PhoneInfoStrategy {
private String phone;
@Override
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public void addModelAttributes(Model model) {
// China Telecom specific implementation
model.addAttribute("user", "China Telecom User");
model.addAttribute("phone", phone);
model.addAttribute("location", "China");
}
}
```
然后,在控制器中,我们通过 switch 语句或者 map 映射,根据不同的手机号码,选择对应的实现类:
```
@Controller
public class PhoneInfoController {
private final Map<String, PhoneInfoStrategy> strategyMap = new HashMap<>();
public PhoneInfoController() {
strategyMap.put("13800138000", new ChinaMobileStrategy());
strategyMap.put("13800139000", new ChinaUnicomStrategy());
strategyMap.put("13800136000", new ChinaTelecomStrategy());
// ...
}
@GetMapping("/phone-info")
public String getMapping(@RequestParam("phone") String phone, Model model) {
PhoneInfoStrategy strategy = strategyMap.getOrDefault(phone, null);
if (strategy != null) {
strategy.setPhone(phone);
strategy.addModelAttributes(model);
return "phone-info-page";
} else {
throw new IllegalArgumentException("Invalid phone number!");
}
}
}
```
使用策略模式,我们避免了使用过多的 if-else 分支语句,使代码更加简洁、可扩展和易于维护。
### 回答2:
在Java的MVC框架中,通常使用@Controller注解来定义Controller类。对于Controller中的方法,可以使用@GetMapping注解来指定接收GET请求的路径。为了避免使用if-else语句根据手机号来判断调用不同的实现类,我们可以使用策略模式。
首先,我们需要定义一个接口,例如UserInfoService,用于查询用户信息并返回结果。接口中可以定义一个方法,例如getUserInfoByPhone(String phoneNumber),用于根据手机号查询用户信息。根据不同的手机号,我们可以有不同的实现类,例如RealUserInfoServiceImpl和MockUserInfoServiceImpl,分别用于真实环境和测试环境。
```java
public interface UserInfoService {
UserInfo getUserInfoByPhone(String phoneNumber);
}
public class RealUserInfoServiceImpl implements UserInfoService {
public UserInfo getUserInfoByPhone(String phoneNumber) {
// 真实环境下的查询逻辑
// ...
}
}
public class MockUserInfoServiceImpl implements UserInfoService {
public UserInfo getUserInfoByPhone(String phoneNumber) {
// 测试环境下的查询逻辑
// ...
}
}
```
接下来,在Controller中使用@Autowired注解注入UserInfoService,并使用策略模式来根据手机号调用不同的实现类查询用户信息。
```java
@Controller
public class UserController {
@Autowired
private UserInfoService userInfoService;
@GetMapping("/user/{phoneNumber}")
public String getUserInfo(@PathVariable String phoneNumber, Model model) {
UserInfo userInfo = userInfoService.getUserInfoByPhone(phoneNumber);
if (userInfo != null) {
model.addAttribute("userInfo", userInfo);
return "userinfo";
} else {
return "error";
}
}
}
```
在上述例子中,根据路径"/user/{phoneNumber}"来匹配请求,使用路径上的手机号作为参数传递给getUserInfo方法。getUserInfo方法根据注入的UserInfoService来调用不同的实现类进行查询,将查询结果通过Model对象添加到视图中。
这样,当用户发起"/user/1234567890"的GET请求时,Controller将根据手机号调用相应的实现类查询用户信息,并将查询结果添加到Model对象中,然后返回对应的视图页面。
### 回答3:
策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使其可以相互替换。在Java MVC框架中,我们可以使用策略模式来代替if-else语句来根据手机号调用不同的实现类来查询不同的信息,并将结果添加到model中返回不同的页面。
假设有三种不同的查询实现类分别为:QueryInfo1、QueryInfo2和QueryInfo3,同时有三个不同的页面分别为page1、page2和page3。我们可以定义一个接口QueryStrategy来统一不同的查询实现类:
public interface QueryStrategy {
void query(String phoneNumber, Model model);
}
然后,分别为每个实现类实现该接口,实现具体的查询逻辑并将结果添加到model中,例如:
public class QueryInfo1 implements QueryStrategy {
public void query(String phoneNumber, Model model) {
// 具体的查询逻辑
String result = "根据手机号(" + phoneNumber + ")查询到的信息1";
model.addAttribute("result", result);
}
}
public class QueryInfo2 implements QueryStrategy {
public void query(String phoneNumber, Model model) {
// 具体的查询逻辑
String result = "根据手机号(" + phoneNumber + ")查询到的信息2";
model.addAttribute("result", result);
}
}
public class QueryInfo3 implements QueryStrategy {
public void query(String phoneNumber, Model model) {
// 具体的查询逻辑
String result = "根据手机号(" + phoneNumber + ")查询到的信息3";
model.addAttribute("result", result);
}
}
在Controller的getMapping中,我们可以使用策略模式来根据手机号调用不同的实现类,例如:
@Controller
public class MyController {
@Autowired
private QueryStrategy queryInfo1;
@Autowired
private QueryStrategy queryInfo2;
@Autowired
private QueryStrategy queryInfo3;
@GetMapping("/query")
public String queryInfo(@RequestParam("phoneNumber") String phoneNumber, Model model) {
if (phoneNumber.startsWith("1")) {
queryInfo1.query(phoneNumber, model);
return "page1";
} else if (phoneNumber.startsWith("2")) {
queryInfo2.query(phoneNumber, model);
return "page2";
} else if (phoneNumber.startsWith("3")) {
queryInfo3.query(phoneNumber, model);
return "page3";
}
// ... 还可以添加更多的判断逻辑
return "error";
}
}
在上述例子中,根据不同的手机号前缀,将会调用不同的查询实现类,将查询结果添加到model中,然后返回不同的页面。这样,我们避免了使用if-else语句,使得代码更加简洁、易读和易于扩展。
阅读全文