目录
2.3 定义一个封装多实现的配置:UserServiceConfig;
一、策略模式介绍
策略模式:指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。
优点:
1.算法可以自由切换对应实现,避免大量的if-else,利于维护
2.可扩展性好,新业务只需实现其接口就行
缺点:
1.策略类会不断增加,相互之间不利于复用
2.所有的策略类都需要对外暴露
举个简单的栗子:
比如穿衣服,星期一穿红色,星期二穿蓝色,我们可以根据前端传值的不同,来选择不同的执行方法;
二、代码实现
下面我们模拟一个策略模式实现:场景是某个username,根据type选择对应的人向其做个自我介绍打招呼;
项目结构可以使用springboot快速创建,采用swagger调测接口,具体不在本问详细叙述;
项目git地址:https://github.com/yangshilei/springCloud.git
2.1 定义一个接口:UserService;
package com.demo.spring.design.strategy_model;
public interface UserService {
String getUserName(String username);
}
2.2 定义2个策略实现类:
TomServiceImpl:
package com.demo.spring.design.strategy_model.Impl;
import com.demo.spring.design.strategy_model.UserService;
import org.springframework.stereotype.Service;
@Service
public class TomServiceImpl implements UserService {
@Override
public String getUserName(String username) {
return "我是tom,"+username;
}
}
JackServiceImpl:
package com.demo.spring.design.strategy_model.Impl;
import com.demo.spring.design.strategy_model.UserService;
import org.springframework.stereotype.Service;
@Service
public class JackServiceImpl implements UserService {
@Override
public String getUserName(String username) {
return "我是jack,"+username;
}
}
2.3 定义一个封装多实现的配置:UserServiceConfig;
package com.demo.spring.design.strategy_model;
import com.demo.spring.design.strategy_model.Impl.JackServiceImpl;
import com.demo.spring.design.strategy_model.Impl.TomServiceImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
/**
* 策略模式的关键,动态获取对应的业务实现类;
*/
@Configuration
public class UserServiceConfig {
@Resource
private TomServiceImpl tomServiceImpl;
@Resource
private JackServiceImpl jackServiceImpl;
@Bean
public Map<Integer,UserService> getUserService(){
Map<Integer,UserService> map = new HashMap<>();
map.put(1,tomServiceImpl);
map.put(2,jackServiceImpl);
return map;
}
}
2.4 定义一个工厂类:UserTypeFactory;
采用工厂模式,可以避免在controller中挨个引入UserService的具体实现bean;
package com.demo.spring.design.strategy_model;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class UserTypeFactory {
@Autowired
private UserServiceConfig userServiceConfig;
public UserService getUserService(Integer type){
return userServiceConfig.getUserService().get(type);
}
}
2.5 定义用户接口:UserController
package com.demo.spring.controller;
import com.demo.spring.design.strategy_model.UserTypeFactory;
import com.demo.spring.dto.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@Api("策略模式介绍")
@RestController
@RequestMapping(value = "/user")
public class UserController {
// 通过工厂模式来选择需要执行的对应实现
@Autowired
private UserTypeFactory factory;
@ApiOperation(value = "策略模式执行查询用户名",notes = "策略模式执行查询用户名")
@GetMapping("/test")
Result getUserName(Integer type,String username){
UserService userService = factory.getUserService(type);
String userName = "";
if(null != userService){
userName = userService.getUserName(username);
}
return Result.ok(userName);
}
}
2.6 swagger测试
type先输入1,看是否输出tomServiceImpl的方法;
type再输入2,应该就是jackServiceImpl的方法;
type再换成3,由于没有定义3时候的策略方法实现,所有输出是空字符串"";
好了,到此就大概演示结束了,早点睡觉,防止秃头;