1 模板方法模式
1.1 接口定义
/**
* 高校管理
*/
public interface IUniversityManage {
/**
* 名称分析
* @param name 学校名称
* @return
*/
String analysisName(String name);
}
1.2 抽象类实现接口,并定义抽象方法
@Service
public abstract class AbstractUniversity implements IUniversityManage{
/**
* 名称分析
* @param name 学校名称
* @return
*/
@Override
public String analysisName(String name) {
//根据具体继承类调用对应的getAddress(..)
return getAddress(name);
}
public abstract String getAddress(String name);
}
1.3 两个继承抽象类的方法
/**
* 福大
*/
@Slf4j
@Service
public class FdUniversity1 extends AbstractUniversity {
@Override
public String getAddress(String name) {
// 处理其他业务......
log.info("处理福州大学业务");
return name+"地址:福州市静安区";
}
}
/**
* 厦大
*/
@Slf4j
@Service
public class XdUniversity1 extends AbstractUniversity{
@Override
public String getAddress(String name) {
// 处理其他业务......
log.info("处理厦门大学业务");
return name+"地址:厦门市思明区";
}
}
1.4 根据不同场景调用不同的抽象方法实现类
/**
* @author zhujianming
* 模板方法模式
*/
@RequestMapping("/kindsmodels1")
@RestController
@Slf4j
@Api(tags = "设计模式")
public class MyController1 {
/**
* 模板方法模式:定义一个接口,由抽象类实现,同时抽象类中定义业务抽象方法,
* 由业务类继承抽象类做业务逻辑细化,具体调用哪个业务逻辑,抽象类实现的接口会做动态判断
*/
@PostMapping("/universityAddress/{universityName}")
@ApiOperation(value = "查询高校地址【模板方法模式】", notes = "query student list")
public String universityAddress(@ApiParam(name = "universityName", value = "厦门大学、厦门大学", defaultValue = "厦门大学") @PathVariable("universityName") String universityName) {
AbstractUniversity university = null;
if (universityName.equals("厦门大学")) {
university = SpringBeanUtils.getBean(XdUniversity1.class);
} else {
university = SpringBeanUtils.getBean(FdUniversity1.class);
}
return university.analysisName(universityName);
}
}
2 策略工厂模式
2.1 接口定义
/**
* 高校管理
*/
public interface IUniversityManage {
/**
* 通过高校名称获取地址
* @param name 学校名称
* @return
*/
String getAddress(String name);
}
2.2 工厂类【添加工厂和获取工厂】
/**
* 高校工厂
*/
public class UniversityFactory {
public static Map<String,IUniversityManage> universityMap= Maps.newHashMap();
/**
* 通过工厂获取指定高校
* @param name
* @return
*/
public static IUniversityManage getFactory(String name){
return universityMap.get(name);
}
/**
* 向工厂中添加指定高校
* @param name
* @param manage
*/
public static void createFactory(String name,IUniversityManage manage){
universityMap.put(name,manage);
}
}
2.3 三个工厂
/**
* 福大
*/
@Slf4j
@Service
public class FdUniversity2 implements IUniversityManage, InitializingBean {
@Override
public String getAddress(String name) {
// 处理其他业务......
log.info("处理福州大学业务");
return name+"地址:福州市静安区";
}
@Override
public void afterPropertiesSet() throws Exception {
UniversityFactory.createFactory("福州大学",this);
}
}
/**
* 农大
*/
@Slf4j
@Service
public class NlUniversity2 implements IUniversityManage, InitializingBean {
@Override
public String getAddress(String name) {
// 处理其他业务......
log.info("处理农林大学业务");
return name+"地址:福州市鼓楼区";
}
@Override
public void afterPropertiesSet() throws Exception {
UniversityFactory.createFactory("农林大学",this);
}
}
/**
* 厦大
*/
@Slf4j
@Service
public class XdUniversity2 implements IUniversityManage, InitializingBean {
@Override
public String getAddress(String name) {
// 处理其他业务......
log.info("处理厦门大学业务");
return name+"地址:厦门市思明区";
}
@Override
public void afterPropertiesSet() throws Exception {
UniversityFactory.createFactory("厦门大学",this);
}
}
2.4 根据不同场景获取不同工厂,并实现对应方法
@RequestMapping("/kindsmodels2")
@RestController
@Slf4j
@Api(tags = "设计模式")
public class MyController2 {
/**
* 策略模式:同一接口有不同的实现类
* 工厂模式:建立以bean匹配名称为name,bean对象为value的键值对map,
* 实例化bean时通过afterPropertiesSet为map中添加值
*/
@PostMapping("/universityAddress/{universityName}")
@ApiOperation(value = "查询高校地址【策略模式+工厂模式】", notes = "query student list")
public String universityAddress(@ApiParam(name = "universityName", value = "厦门大学、农林大学、厦门大学",defaultValue = "厦门大学") @PathVariable("universityName") String universityName) {
IUniversityManage universityManage=UniversityFactory.getFactory(universityName);
return universityManage.getAddress(universityName);
}
}
3 策略模式
3.1 接口定义
/**
* 高校管理
*/
public interface IUniversityManage {
/**
* 获取地址
* @param name 学校名称
* @return
*/
String getAddress(String name);
}
3.2 上下文,初始化所有策略
/**
* 高校上下文
*/
@Service
public class UniversityContext {
private final Map<String, IUniversityManage> strategyMap = new ConcurrentHashMap<>();
/**
* 构造函数按类型注入
*/
public UniversityContext(Map<String, IUniversityManage> strategyMap) {
strategyMap.forEach(this.strategyMap::put);
}
public IUniversityManage getContext(String beanName){
return strategyMap.get(beanName)==null?null:strategyMap.get(beanName);
}
}
3.3 两大策略
/**
* 福大
*/
@Slf4j
@Service(value = "fd")
public class FdUniversity3 implements IUniversityManage {
@Override
public String getAddress(String name) {
// 处理其他业务......
log.info("处理福州大学业务");
return name+"地址:福州市静安区";
}
}
/**
* 厦大
*/
@Slf4j
@Service(value = "xd")
public class XdUniversity3 implements IUniversityManage {
@Override
public String getAddress(String name) {
// 处理其他业务......
log.info("处理厦门大学业务");
return name+"地址:厦门市思明区";
}
}
3.4 根据不同场景获取指定上下文策略
/**
* @author zhujianming
* 策略模式
*/
@RequestMapping("/kindsmodels3")
@RestController
@Slf4j
@Api(tags = "设计模式")
public class MyController3 {
@Autowired
private UniversityContext context;
/**
*
*/
@PostMapping("/universityAddress/{universityName}")
@ApiOperation(value = "查询高校地址【策略模式】", notes = "query student list")
public String universityAddress(@ApiParam(name = "universityName", value = "厦门大学、厦门大学", defaultValue = "厦门大学") @PathVariable("universityName") String universityName) {
String beanName = null;
if (universityName.equals("厦门大学")) {
beanName = "xd";
} else {
beanName = "fd";
}
return context.getContext(beanName).getAddress(universityName);
}
}
4 适配器模式
4.1 接口定义
/**
* 高校管理
*/
public interface IUniversityManage {
/**
* 获取地址
* @param name 学校名称
* @return
*/
String getAddress(String name);
boolean supports(IUniversityManage manage);
}
4.2 适配工具类
public class HandlerUtil {
public static List<IUniversityManage> handlerAdapters = new ArrayList<IUniversityManage>();
public static IUniversityManage getHandler(IUniversityManage manage) {
for (IUniversityManage universityManage : handlerAdapters) {
if (universityManage.supports(manage)) {
return universityManage;
}
}
return null;
}
}
4.3 两大接口实现类
/**
* 福大
*/
@Slf4j
@Service
public class FdUniversity4 implements IUniversityManage, InitializingBean {
@Override
public String getAddress(String name) {
// 处理其他业务......
log.info("处理福州大学业务");
return name+"地址:福州市静安区";
}
@Override
public boolean supports(IUniversityManage manage) {
return (manage instanceof FdUniversity4);
}
@Override
public void afterPropertiesSet() throws Exception {
HandlerUtil.handlerAdapters.add(this);
}
}
/**
* 厦大
*/
@Slf4j
@Service
public class XdUniversity4 implements IUniversityManage, InitializingBean {
@Override
public String getAddress(String name) {
// 处理其他业务......
log.info("处理厦门大学业务");
return name+"地址:厦门市思明区";
}
@Override
public boolean supports(IUniversityManage manage) {
return (manage instanceof XdUniversity4);
}
@Override
public void afterPropertiesSet() throws Exception {
HandlerUtil.handlerAdapters.add(this);
}
}
4.4 通过指定条件适配指定实现类
/**
* @author zhujianming
* 适配器模式
*/
@RequestMapping("/kindsmodels4")
@RestController
@Slf4j
@Api(tags = "设计模式")
public class MyController4 {
@Autowired
private XdUniversity4 xd;
/**
*
*/
@PostMapping("/universityAddress/{universityName}")
@ApiOperation(value = "查询高校地址【适配器模式】", notes = "query student list")
public String universityAddress(@ApiParam(name = "universityName", value = "厦门大学、厦门大学", defaultValue = "厦门大学") @PathVariable("universityName") String universityName) {
IUniversityManage manage=HandlerUtil.getHandler(xd);
return manage.getAddress(universityName);
}
}