策略模式的介绍与使用

目录

 

一、策略模式介绍

二、代码实现

2.1 定义一个接口:UserService;

2.2 定义2个策略实现类:

2.3 定义一个封装多实现的配置:UserServiceConfig;

2.4 定义一个工厂类:UserTypeFactory;

2.5 定义用户接口:UserController

2.6 swagger测试


一、策略模式介绍

策略模式:指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。

优点:

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时候的策略方法实现,所有输出是空字符串"";

好了,到此就大概演示结束了,早点睡觉,防止秃头;

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值