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

问题

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

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对应的处理方式,其他代码不用修改,代码完全解耦,条理清晰,易于扩展

下课!

相关推荐
昕冉几秒前
利用 Axrue9 中继器实现表格数据的查询
设计模式·设计
曲莫终7 分钟前
SpEl表达式之强大的集合选择(Collection Selection)和集合投影(Collection Projection)
java·spring boot·spring
ajassi200024 分钟前
开源 java android app 开发(十二)封库.aar
android·java·linux·开源
q5673152331 分钟前
Java使用Selenium反爬虫优化方案
java·开发语言·分布式·爬虫·selenium
kaikaile199535 分钟前
解密Spring Boot:深入理解条件装配与条件注解
java·spring boot·spring
守护者1701 小时前
JAVA学习-练习试用Java实现“一个词频统计工具 :读取文本文件,统计并输出每个单词的频率”
java·学习
bing_1581 小时前
Spring Boot 中ConditionalOnClass、ConditionalOnMissingBean 注解详解
java·spring boot·后端
ergdfhgerty1 小时前
斐讯N1部署Armbian与CasaOS实现远程存储管理
java·docker
勤奋的知更鸟1 小时前
Java性能测试工具列举
java·开发语言·测试工具
三目君1 小时前
SpringMVC异步处理Servlet
java·spring·servlet·tomcat·mvc