博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
小菜学设计模式——策略模式
阅读量:6294 次
发布时间:2019-06-22

本文共 1082 字,大约阅读时间需要 3 分钟。

hot3.png

背景

    同一个问题,总是有许多中解决问题的办法,如何才能让这些办法同时存在而又互不干扰呢?就可以使用策略模式。

1、使用意图

    策略模式:它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户端。

    意图很明确,对一种问题可以有多种解决方式,而这些解决方式都是互不干扰,但他们又属于同一个家族。

2、生活实例

    商场促销商品,然而促销商品的策略多种多样,比如买一送一、满100奖50、两件88折等,这些策略都是同属于商品的促销策略家族,但是他们之间的算法是互不干涉的,实际上就是多态的提现。

3、Java 例子(框架、JDK 、JEE)

    曾经写过一个工具类,关于使用iReport生成html、excel、pdf、doc的报表的SDK,客户只需要传入数据和想要的报表类型,我就可以为他生成对应的类型的数据报表。这就是一个典型的简单工厂模式,同时也是一个典型的策略模式,所以你会发现,简单工厂模式和策略模式几乎相同,当然,二者的侧重点是完全不一致的。一个客户端类 Client,一个总接口,IExport,声明导出方法export,然后,分别实现报表类型的导出方法。

4、模式类图

001252_Qzs4_1989321.png

5、模式优点

    策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。

    使用策略模式其实直接或间距的消除了条件语句,因为这些行为都被封装在一个个独立的策略具体类当中。

    策略模式是用来封装算法的,但在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。

    条件语句的时候,如果发现是业务规则不同的处理,那么确实可以考虑策略模式。

6、与类似模式比较

    策略模式很常见,而且,个人觉得只要是条件语句的地方几乎都可以理解为再选择合适的策略。

    和简单工厂模式结合使用,因为策略的不同是由子类的重写产生,也就是子类的不同导致了策略的不同,那么简单工厂方法模式可以控制对应子类的生成,正好为策略模式派上用场,所以,如果用到了策略模式,请一定要记得是否可以使用简单工厂模式呢?

    前面说到策略模式和简单工厂模式的类图基本相同,但是二者的侧重点不一样,前者在于算法的不同实现,后者不同对象的实例化,况且,仔细看策略模式你会发现,实际上策略模式可以包含简单工厂模式。

转载于:https://my.oschina.net/heweipo/blog/424091

你可能感兴趣的文章
开发者论坛一周精粹(第五十四期) 求购备案服务号1枚!
查看>>
validate表单验证及自定义方法
查看>>
javascript 中出现missing ) after argument list的错误
查看>>
使用Swagger2构建强大的RESTful API文档(2)(二十三)
查看>>
Docker容器启动报WARNING: IPv4 forwarding is disabled. Networking will not work
查看>>
(转)第三方支付参与者
查看>>
程序员修炼之道读后感2
查看>>
DWR实现服务器向客户端推送消息
查看>>
js中forEach的用法
查看>>
Docker之功能汇总
查看>>
!!a标签和button按钮只允许点击一次,防止重复提交
查看>>
(轉貼) Eclipse + CDT + MinGW 安裝方法 (C/C++) (gcc) (g++) (OS) (Windows)
查看>>
还原数据库
查看>>
作业调度框架 Quartz.NET 2.0 beta 发布
查看>>
mysql性能的检查和调优方法
查看>>
项目管理中的导向性
查看>>
Android WebView 学习
查看>>
(转)从给定的文本中,查找其中最长的重复子字符串的问题
查看>>
HDU 2159
查看>>
spring batch中用到的表
查看>>