SpringBoot系列--基于@Autowired注解实现策略模式

在项目实际开发中,常常会遇到用户鉴权、分等级查询、接口调用等复杂问题。如我们平常看到的视频分享,可以分享到 微信、微博、支付宝、淘宝等,都是调用不同接口,如果我们用if else 来做这些调用,会让代码特别冗余,也违反了开闭原则(对扩展开放,对修改关闭),每次加入新接口都要修改源代码,存在很大的安全隐患。为解决这类问题,我们常常使用设计模式中的策略模式(Strategy Pattern)。

我们知道全球的动物有很多种,猫有猫吃的东西,不同的本领;狗有狗吃的东西,不同的本领…

下面用SpringBoot 中的 @Autowired 注入实现针对动物不同行为的策略模式。

公共接口

package com.tcwong.demo.service;

public interface AnimalService {
	String eat(String foodName);

	String getAnimalName();
}

cat 实现类

package com.tcwong.demo.service.impl;

import com.tcwong.demo.service.AnimalService;
import org.springframework.stereotype.Service;

@Service
public class CatServiceImpl implements AnimalService {

	@Override
	public String eat(String foodName) {
		return "猫咪吃:" + foodName + "--会捉老鼠";
	}

	@Override
	public String getAnimalName() {
		return "cat";
	}
}

dog实现类

package com.tcwong.demo.service.impl;

import com.tcwong.demo.service.AnimalService;
import org.springframework.stereotype.Service;

@Service
public class DogServiceImpl implements AnimalService {

	@Override
	public String eat(String foodName) {
		return "狗吃:" + foodName + "----会看见";
	}

	@Override
	public String getAnimalName() {
		return "dog";
	}
}

策略工厂

package com.tcwong.demo.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class AnimalStrategyFactoryService {

	@Autowired
	private List animalServiceList;

	public AnimalService getAniMalService(String animalName) {
		for (AnimalService animalService : animalServiceList) {
			boolean equals = animalService.getAnimalName().equals(animalName);
			if (equals) {
				return animalService;
			}
		}
		return null;
	}
}

接口实现

package com.tcwong.demo.controller;

import com.tcwong.demo.service.AnimalService;
import com.tcwong.demo.service.AnimalStrategyFactoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class AnimalController {

	@Autowired
	private AnimalStrategyFactoryService animalServices;

	@GetMapping("/eatFood")
	public String eatFood(String animalName, String foodName) {
		String result = null;
		AnimalService aniMalService = animalServices.getAniMalService(animalName);
		if (aniMalService != null) {
			result = aniMalService.eat(foodName);
			System.out.println(result);
		}
		return result;
	}

}

测试

我们输入不同的参数

localhost:8080/eatFood?animalName=cat&foodName=小鱼

localhost:8080/eatFood?animalName=dog&foodName=骨头

Ok ,这样如果我们后面要加入新的动物如

鸡吃:虫子–会下蛋。

只需要实现 AnimalService 接口就好,不会修改源代码。

SpringBoot系列--基于@Autowired注解实现策略模式_第1张图片

你可能感兴趣的:(SpringBoot)