1.策略模式理解
1.1接口
public interface Food {
void eat(String personName);
void remark(String personName, String feel);
}
1.2 接口实现类
public class BananaFood implements Food {
@Override
public void eat(String personName) {
System.out.println(personName + "吃了一个香蕉");
}
@Override
public void remark(String personName, String feel) {
System.out.println(personName + "评价香蕉:" + feel);
}
}
public class AppleFood implements Food {
@Override
public void eat(String personName) {
System.out.println(personName + "吃了一个苹果");
}
@Override
public void remark(String personName, String feel) {
System.out.println(personName + "评价苹果:" + feel);
}
}
1.3 工厂类
public class FruitFactory {
public FruitFactory() {
fruitMap.put("apple", new AppleFood());
fruitMap.put("banana", new BananaFood());
}
public final HashMap<String, Food> fruitMap = new HashMap<>();
public Food getFood(String foodType) {
return fruitMap.get(foodType);
}
}
1.4使用
public class EatTest {
public static void main(String[] args) {
// 传参
String eatType = "banana";
String personName = "张三";
// 使用
FruitFactory factory = new FruitFactory();
Food food = factory.getFood(eatType);
food.eat(eatType);
food.remark(personName,"还不错");
// 优点:满足了单一原则,开闭原则,增加了代码可读性
// 缺点:策略类数量多
// 使用场景,在有多个if-elseif判断的情况下,代码比较多,而且else if还有可能增加,策略模式在项目中使用还是比较多的:
// 需求一:手动实现,系统要求查询不同类型数据库的元数据(有多少表,每个表哪些字段),由于不同数据库的元数据存在不同的表中。此时可以策略模式,每个类实现一个查询元数据的方法
// 需求二: 不使用流程框架的情况下实现流程逻辑,可以使用策略模式,每个节点为一个流程类
}
}
2.策略模式在spring中的使用
2.2接口实现类修改为给spring管理 使用@Service或者@Component
@Service("BananaFood")
public class BananaFood implements Food {
@Override
public void eat(String personName) {
System.out.println(personName + "吃了一个香蕉");
}
@Override
public void remark(String personName, String feel) {
System.out.println(personName + "评价香蕉:" + feel);
}
}
@Service("AppleFood")
public class AppleFood implements Food {
@Override
public void eat(String personName) {
System.out.println(personName + "吃了一个苹果");
}
@Override
public void remark(String personName, String feel) {
System.out.println(personName + "评价苹果:" + feel);
}
}
2.3工厂类交给spring管理, 通过@Resource注解注入上面的类到map中
@Component
public class FruitFactory {
@Resource
private Map<String, Food> fruitMap;
public Food getFood(FruitTypeEnum foodType) {
return fruitMap.get(foodType.getValue);
}
}
2.4类型改为枚举
@Getter
@AllArgsConstructor
public enum FruitTypeEnum {
APPLE("apple","苹果"),
BANANA("banana","香蕉"),
;
private final int value;
private final String name;
public static AbroadProcessEnum fromValue(Integer value) {
if (value != null) {
for (AbroadProcessEnum processEnum : AbroadProcessEnum.values()) {
if (processEnum.getValue() == value) {
return processEnum;
}
}
}
return null;
}
}
通过@Resource注入工厂类就可以使用了