文档章节

小菜学设计模式——策略模式

learn_more
 learn_more
发布于 2015/06/03 00:13
字数 937
阅读 154
收藏 11

背景

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


1、使用意图

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

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



2、生活实例

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



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

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



4、模式类图



5、模式优点

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

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

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

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


6、与类似模式比较

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

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

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




© 著作权归作者所有

learn_more
粉丝 93
博文 240
码字总数 210196
作品 0
深圳
程序员
私信 提问
迈向大牛的重要一步——掌握设计模式

IT职场的小菜经常有这样的疑问: 为什么一个相似的功能,大牛一会儿就搞定,然后悠闲地品着下午茶逛淘宝;而自己加班加点搞到天亮还做不完。 为什么用户提出需求变更后,大牛只需潇洒地敲敲键...

一枚Sir
2015/04/10
322
0
《JavaScript设计模式与开发实践》原则篇(2)—— 最少知识原则

最少知识原则(LKP)说的是一个软件实体应当尽可能少地与其他实体发生相互作用。这 里的软件实体是一个广义的概念,不仅包括对象,还包括系统、类、模块、函数、变量等。 单一职责原则指导我们...

嗨呀豆豆呢
2018/12/30
0
0
设计模式已经陨落了?

你现在是坐在一个程序员旁边吗?如果是的话,那么在你读下面的段落之前,有一个简单的实验。让他们到一边去,问问他们两个问题并记录下答案。首先问他们“什么是设计模式?”然后再问“说出你...

oschina
2014/03/11
9.4K
69
《JavaScript设计模式与开发实践》最全知识点汇总大全

系列文章: 《JavaScript设计模式与开发实践》基础篇(1)—— this、call 和 apply 《JavaScript设计模式与开发实践》基础篇(2)—— 闭包和高阶函数 《JavaScript设计模式与开发实践》模式...

嗨呀豆豆呢
01/04
0
0
编程中的那些套路——关于策略模式

该文章属于《编程中的那些经典套路——设计模式汇总》系列,并且以下内容基于语言PHP 今天讲讲策略模式,策略模式 和工厂模式十分相像(或者说在代码逻辑层面,他们是一样的)。 但策略模式与...

gzchen
2018/08/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

刚哥谈架构 (二) 我眼中的架构师

之前在公司,有小伙伴在向别人介绍我的时候,经常会有人这么说:“刚哥是我们的architcture”,如果来人是老外,心中一定是一惊,心中暗叹,“这位匪首看上去貌不惊人,难道已经做到了架构和...

naughty
40分钟前
3
0
OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
今天
111
4
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
5
0
Spring Boot + Mybatis-Plus 集成与使用(二)

前言: 本章节介绍MyBatis-Puls的CRUD使用。在开始之前,先简单讲解下上章节关于Spring Boot是如何自动配置MyBatis-Plus。 一、自动配置 当Spring Boot应用从主方法main()启动后,首先加载S...

伴学编程
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部