您现在的位置是:首页 >技术交流 >策略模式——实践:在业务逻辑中理解设计模式网站首页技术交流

策略模式——实践:在业务逻辑中理解设计模式

linrongchen 2024-09-03 12:01:03
简介策略模式——实践:在业务逻辑中理解设计模式

一般定义

策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。

主要角色

Context: 环境类
Strategy: 抽象策略类
ConcreteStrategy: 具体策略类
策略模式UML图

结合场景理解

一般来说,我们的controller层只做业务的编排,不进行业务逻辑的处理,也就是说不希望有很多if else这样的分支

比如,对于广告投放系统,我们的代码中有一套一般流程的投放逻辑,但是我们总会有一些大客户,他们希望定制一些个性化的投放功能。

不使用策略模式之前,对于亚马逊或者京东等需要定制化的大客户,我们可能的做法是在controller层根据厂商标识mark(比如京东为JD,亚马逊为YM)走不同的逻辑,这样其实是不好的,这会使得算法和业务耦合。

这个时候,可以考虑将if else这些逻辑从controller层抽掉,controller层只处理请求,也就是来的mark不管是什么,我们都同样处理,而不需要在controller层进行判断,把判断的逻辑隐藏在后面,这就是策略模式。

代码

/**
 * 根据不同mark进行不同逻辑(策略)来投放
 *
 */
 class StrategyTest {

    /**
     * controller层
     */
    @Test
    void strategy() {

        StrategyContext strategyContext = new StrategyContext();
        // 假设来的是京东
        AdvertiseStrategy strategy = strategyContext.getStrategy("京东");
        String s = strategy.Advertise();
        System.out.println(s);
    }


    /**
     * 策略接口
     */
    public interface AdvertiseStrategy {
        /**
         * 广告投放
         * @return
         */
        String Advertise();
    }

    /**
     * 默认策略
     */
    @Component
    class DefaultStrategy implements AdvertiseStrategy {
        @Override
        public String Advertise() {
            return "默认——广告投放完成";
        }
    }

    /**
     * 京东策略
     */
    @Component
    class JDStrategy implements AdvertiseStrategy {
        @Override
        public String Advertise() {
            return "京东——广告投放完成";
        }
    }

    /**
     * 亚马逊策略
     */
    @Component
    class YMXStrategy implements AdvertiseStrategy {
        @Override
        public String Advertise() {
            return "亚马逊——广告投放完成";
        }
    }

    /**
     * 策略上下文 、 策略选择器
     * 在这里根据不同策略进行选择
     */
    @Component
    class StrategyContext {

        private Map<String, AdvertiseStrategy> strategyMap = new HashMap<>();

        public StrategyContext() {
            strategyMap.put("京东", new JDStrategy());
            strategyMap.put("亚马逊", new YMXStrategy());
            strategyMap.put("默认", new DefaultStrategy());
        }


        // 策略选择
        public AdvertiseStrategy getStrategy(String Mark) {
            AdvertiseStrategy AdvertiseStrategy = strategyMap.get(Mark);
            if (AdvertiseStrategy != null) {
                return strategyMap.get(Mark);
            }
            // 返回默认的策略
            return new DefaultStrategy();
        }
    }
}

测试结果

京东——广告投放完成

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。