策略+工厂设计模式的应用

问题

比如有下面一段业务,一个自动售货机,根据用户选择不同的饮料,出对应的货

java 复制代码
public class NoDesignDemo {
    public void ifElse(String parameter) {
        if ("Pepsi".equalsIgnoreCase(parameter)) {
            System.out.println("百事可乐-初始无设计");
        }else if ("Coca".equalsIgnoreCase(parameter)){
            System.out.println("可口可乐-初始无设计");
            if("618".equalsIgnoreCase(parameter))
            {
                //需要配合618积分平台大促活动,涉及复杂业务。
            }
            if("1111".equals(parameter))
            {
                //需要配合双11优惠卷平台大促活动,涉及复杂业务。
                //1 MQ同步消息给其它下游系统
                //2 xxl-job做好定时任务扫描,当晚下单下单顾客,没1分钟统计一次送给QTL系统
                //3 。。。。。。
            }
        }else if ("Wahaha".equalsIgnoreCase(parameter)){
            System.out.println("娃哈哈-初始无设计");
        }
    }

    public static void main(String[] args)
    {
        new NoDesignDemo().ifElse("wahaha");
    }
}

这段代码有什么问题?大家想想。。。

很明显,这代码太耦合,太多if...else现在只写了3个,实际情况可能几十个几百个if...else,每次添加一个新的品类,又需要修改原来代码添加一个if...else

使用策略+工厂模式优化

1、先定义一个策略接口

java 复制代码
public interface HandlerStrategyFactory extends InitializingBean
{
    void getDrink(String parameter);

    //继承InitializingBean方法后,Spring容器将在bean属性设置完成后自动调用这个方法
    // void afterPropertiesSet() throws Exception;
}

2、再定义一个饮料工厂

java 复制代码
public class DrinkFactory {
    private static Map<String, HandlerStrategyFactory> strategyMap = new ConcurrentHashMap<>();

    public static HandlerStrategyFactory getInvokeStrategy(String str)
    {
        return strategyMap.get(str);
    }

    public static void register(String str ,HandlerStrategyFactory handler)
    {
        System.out.println("str: "+str+"\t handler: "+handler);
        if (null == str || null == handler)
        {
            return;
        }
        strategyMap.put(str,handler);
    }
}

3、定义各种饮料的处理方式类

java 复制代码
@Component
public class CocaHandler implements HandlerStrategyFactory
{
    @Override
    public void getDrink(String parameter)
    {
        System.out.println("我是可口可乐-策略+工厂 "+parameter);
    }

    @Override
    public void afterPropertiesSet() throws Exception
    {
                               //K          //V
        DrinkFactory.register("Coca",this);
    }
}
java 复制代码
@Component
public class PepsiHandler implements HandlerStrategyFactory
{
    @Override
    public void getDrink(String parameter)
    {
        System.out.println("我是百事可乐-策略+工厂 "+parameter);
    }

    @Override
    public void afterPropertiesSet() throws Exception
    {
        DrinkFactory.register("Pepsi",this);
    }
}
java 复制代码
@Component
public class WahahaHandler implements HandlerStrategyFactory
{
    @Override
    public void getDrink(String parameter)
    {
        System.out.println("我是娃哈哈可乐-策略+工厂 "+parameter);
    }

    @Override
    public void afterPropertiesSet() throws Exception
    {
        DrinkFactory.register("Wahaha",this);
    }
}

测试

java 复制代码
    @Test
    public void invokeStrategyFactory()
    {
        String parameter = "Coca";  //Pepsi //Coca

        HandlerStrategyFactory invokeStrategy = DrinkFactory.getInvokeStrategy(parameter);

        invokeStrategy.getDrink(parameter);
    }

这样优化有什么好处?现在新来一个品类,只需要加一个xxxHandler对应的处理方式,其他代码不用修改,代码完全解耦,条理清晰,易于扩展

下课!

相关推荐
sxlishaobin22 分钟前
Maven Setting详解
java·学习·maven
知守观28 分钟前
一个方法两个触发口:反编译 XXL-Job 后,我看清了 inner/job 子包的裸奔现状
java·spring boot·微服务
用户31268748772029 分钟前
CompletableFuture 链式编排:异步编程的优雅解法
java
瑞雪兆丰年兮44 分钟前
JavaWeb-day14-SpringBootWeb原理篇
java·开发语言·spring boot·spring·bean·mybatis·javaweb
神仙别闹1 小时前
基于 Java GUI 贪心策略直接搜索算法和极大极小博弈树算法的智能人机博弈五子棋游戏
java·毕业设计·gui·贪心策略·极大极小博弈树
Flynn Liang2 小时前
RAG 评估体系:黄金集、检索指标与 LLM-as-Judge 落地
java·langchain·rag·评估·langchain4j·检索指标
杯子不吃紫菜2 小时前
LangGraph 体系实战(下):中断恢复、流式、子图与设计模式
单片机·嵌入式硬件·设计模式
SomeOtherTime2 小时前
Rust生命周期介绍(AI回答)
开发语言·后端·rust
程序猿打工仔2 小时前
计算机基础(C语言)考编、专技岗
c语言·开发语言·算法
喵本喵叁肆3 小时前
Rényi 差分隐私:把隐私损失看成一族矩(英文原题:Rényi Differential Privacy (CSF 2017))
开发语言·r语言