设计模式--策略模式

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注入工厂类就可以使用了

如何用策略模式,优化你代码里的的if-else?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值