美文网首页
设计模式-策略者模式(行为型)

设计模式-策略者模式(行为型)

作者: NealLemon | 来源:发表于2019-08-22 21:54 被阅读0次

    定义

    • 定义了一组算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响到使用算法的用户。
    • 通俗来讲就是一组应用逻辑,在用户使用某一行为时,在一组应用中可以随意替换。

    适用场景

    • 有大量的if....else... 语句时。
    • 在很多只有行为不同的类中使用。
    • 一个系统需要在动态的几种策略中选择某一种。

    优点

    • 开闭原则。
    • 避免使用if...else...或者switch
    • 提高算法的保密性和安全性

    缺点

    • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
    • 产生过多的策略类。

    代码

    出于实际出发,我会在web环境下演示策略模式,使用的是springboot工程。

    首先让我们来想一下这么一个业务场景,在现在很多电商都各种搞促销,比如618,双11,近期的816和818等,因此对于促销的方式就属于一种策略。一般有如下几种

    • 满减
    • 折扣
    • 返现

    因此我们现在来实现同样买一台电脑,使用不同策略的场景吧。

    首先我们需要一个springboot工程,我们只需要使用 Spring官方的快速搭建即可。我们只需要引入Web依赖。具体搭建方式就不详细说了。

    促销统一接口(SaleActivity)

    /**
     * 促销活动统一接口
     */
    public interface SaleActivity {
        //促销
        void sale();
    }
    

    打折促销(OnSaleSaleActivity)

    /**
     * 打折促销实现类
     */
    public class OnSaleSaleActivity implements SaleActivity{
        @Override
        public String sale() {
            return "打折促销";
        }
    }
    

    满减促销(ReduceSaleActivity)

    /**
     * 满减促销
     */
    public class ReduceSaleActivity implements SaleActivity {
        @Override
        public String sale() {
            return "满减促销";
        }
    }
    

    返现促销(ReturnSaleActivity)

    /**
     * 返现促销
     */
    public class ReturnSaleActivity implements SaleActivity{
        @Override
        public String sale() {
            return "返现促销";
        }
    }
    

    促销 Spring 配置类(SaleConfiguration)

    /**
     * 声明spring Bean
     */
    @Configuration
    public class SaleConfiguration {
    
        @Bean
        public OnSaleSaleActivity onSale() {
            return new OnSaleSaleActivity();
        }
    
        @Bean
        public ReduceSaleActivity reduceSale() {
            return new ReduceSaleActivity();
        }
    
        @Bean
        public ReduceSaleActivity returnSale() {
            return new ReduceSaleActivity();
        }
    
    }
    

    这里就不多做解释了,如果不清楚可以去看看spring文档。

    应用层

    @RestController
    @RequestMapping("/sale")
    public class SaleController {
    
        /**
         * 依赖查找
         */
        @Autowired
        private Map<String,SaleActivity> saleActivityMap;
    
        /**
         * 应用层选择某一促销策略
         * @param saletype
         * @return
         */
        @GetMapping("/{saletype}")
        public String goShopping(@PathVariable("saletype") String saletype) {
            SaleActivity saleActivity = saleActivityMap.get(saletype);
            return saleActivity.sale();
        }
    }
    

    在这里我们直接使用 spring 的依赖查找 默认装配所有策略。

    UML 类图

    strategy.jpg

    这里不是标准的策略UML类图,因为使用了spring 的特性,但是看右侧我们还是可以清晰的看出来 行为不同的策略的实现类的结构。

    测试

    我们启动springboot的引导类,相当于启动了一个web项目。然后我们使用postman 来模拟用户请求不同策略查看实现结果。

    strategy1.jpg strategy2.jpg

    我们发现在请求不同的策略时,我们只需要一个接口可以完成不同的策略替换,这就属于策略者模式的一种。

    其他开源

    在spring 中 视图内容协商相关内容中,使用了策略者模式,具体我就不过多解释了,可以参看一下

    Spring--视图内容协商(三)

    小结

    策略者模式在需求变更或者行为繁多的情况下还是很有用武之地的。希望大家灵活的运用起来。

    相关文章

      网友评论

          本文标题:设计模式-策略者模式(行为型)

          本文链接:https://www.haomeiwen.com/subject/wytasctx.html