阅读本文大概需要 1.7 分钟。

本篇是设计模式系列的第三篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统。所以现在打算重写,加上距离现在也有一段时间了,也算是自己的一个回顾吧!

学而时习之,不亦说乎。

推荐阅读:

从零开始单排学设计模式「UML类图」定级赛

从零开始单排学设计模式「简单工厂设计模式」黑铁III

目前段位:黑铁 II

Let's Go!

前言

设计模式不是语法,是一种巧妙的写法,能把程序变的更加灵活。架构模式比设计模式大,架构模式是战略,而设计模式是战术。

设计模式分为3大类型:创建型,行为型,结构型,总共有23种。

策略模式

策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。

用一句话来说,就是:“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。

设计原则有很多,这里直说策略模式中使用到的,参看实例思考哪些地方有用到下面的设计模式:
1. 封装变化(找出应用中可能需要变化之处,把它们独立出来,不要和哪些不需要变化的代码混在一起。)
2. 针对接口,超类编程,而不是针对实现编程。
3. 多用组合,少用继承。

业务需求

如果让你设计一个商场收银软件,营业员根据客户所购买商品的单价和数量,向客户收费。

代码实现

看到需求的你,对它进行了一个分析,只需要把数量乘以单价就可以得出总费用了,这可难不倒我,然后写出了最初版本。

很简单,直接声明方法然后就计算出结算的总价了。

当你准备提交代码的时候,万恶的产品找到你,给出了一个新版的需求。(暗地里画个圈圈咒诅产品...)

新的业务需求

如果让你设计一个商场收银软件,营业员根据客户所购买商品的单价和数量,向客户收费。就是现在商场需要搞活动,会给顾客购买的商品进行打折,比如七五折,九五折等等。

代码实现

这不是计算完总价格之后,在后面乘以一下折扣就可以了。

经过改版,新的代码如下:

还没有等你进行测试,产品就又找上门来了,我们可能后面会实现满300送100、满200送50....等等的很多活动,所以你程序需要设计灵活一点哈,不然到时候我的需求可以还会有变动的。

看到这里,没办法,还是得继续完善程序了,想偷个懒都没有办法,思考这种种得可能,你找寻这有没有能完美贴切这种需求得处理方法。

打一折和打九折只是形式的不同,抽象分析出来,所有的打折算法都是一样的,所以打折算法应该是一个类。冥思苦想下,你又写出了第三版程序:

这里抽离出来一个现金收费类,现金收取类的抽象方法,收取现金,参数为原价,返回当前价。

正常收费子类,正常收费,原价返回。

打折收费子类

返利收费子类

CashContext类,通过构造方法,传入具体的收费策略。

客户端主要代码

运行结果

现在就再也不怕了,如果再增加新的功能,只需要创建新的子类即可。

策略模式UML类图

总结

意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。

主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。

何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。

如何解决:将这些算法封装成一个一个的类,任意地替换。

关键代码:实现同一个接口。

应用实例

1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。

2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。

3、JAVA AWT 中的 LayoutManager。

优点

1、算法可以自由切换。

2、避免使用多重条件判断。

3、扩展性良好。

缺点

1、策略类会增多。

2、所有策略类都需要对外暴露。

使用场景

1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。

2、一个系统需要动态地在几种算法中选择一种。

3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

注意事项:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。

往期精彩回顾

Bing挂了!百度又“赢了”

房东:你敢申报,我就涨房租!京东取消年终奖

自己不付出努力的话,就别指望别人帮你了

向高手进阶,从0开始手写实现一个RPC框架

上班划水神器:一个可以在控制台玩斗地主的项目

请不要尝试简化这些代码

首例"翻墙"被罚!广东警方对“翻墙”上网者重罚

一千行MySQL详细学习笔记(值得学习与收藏)

七点建议助您写出优雅的Java代码

在Java中如何优雅地判空

Java爬取并下载酷狗TOP500歌曲

程序员们,别再学习框架了

专科程序员与本科程序员之间有什么区别

程序员的一天是怎样过的?

欢迎关注我的公众号「程序员的成长之路」,精彩!

从零开始单排学设计模式「策略模式」黑铁 II相关推荐

  1. 从零开始单排学设计模式「代理模式」青铜 III

    阅读本文大概需要 3.2 分钟. 本篇是设计模式系列的第六篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统. 所以现在打算重写,加上距离现在也有一段时间了 ...

  2. 从零开始单排学设计模式「装饰模式」黑铁 I

    阅读本文大概需要 3.6 分钟. 本篇是设计模式系列的第四篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统. 所以现在打算重写,加上距离现在也有一段时间了 ...

  3. 从零开始单排学设计模式「简单工厂设计模式」黑铁 III

    阅读本文大概需要 2 分钟. 本篇是设计模式系列的第二篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统.所以现在打算重写,加上距离现在也有一段时间了,也算 ...

  4. 从零开始单排学设计模式「开发-封闭原则」青铜 - 白银 晋级赛

    阅读本文大概需要 3 分钟. 本篇是设计模式系列的第九篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统. 所以现在打算重写,加上距离现在也有一段时间了,也 ...

  5. 从零开始单排学设计模式「UML类图」定级赛

    阅读本文大概需要 3.5 分钟. 本篇是设计模式系列的开篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统. 所以现在打算重写,加上距离现在也有一段时间了, ...

  6. 从零开始单排学设计模式「UML类图」定级赛 1

    阅读本文大概需要 3.5 分钟. 本篇是设计模式系列的开篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统. 所以现在打算重写,加上距离现在也有一段时间了, ...

  7. LOL设计模式之「策略模式」

    之前写过一篇什么是「设计模式」?,没有类图,没有代码,有些同学说看不太懂,今天给大家带来策略模式(有图,有码,有真相!). 英雄联盟(LOL) 玩过LOL的同学都知道,LOL有上百个英雄,如果用OO技 ...

  8. LOL设计模式之「策略模式」 1

    之前写过一篇什么是「设计模式」?,没有类图,没有代码,有些同学说看不太懂,今天给大家带来策略模式(有图,有码,有真相!). 英雄联盟(LOL) 玩过LOL的同学都知道,LOL有上百个英雄,如果用OO技 ...

  9. 漫画|王者荣耀之「策略模式」

    召唤师技能接口 public interface 召唤师技能 { public void 技能();} 具体实现 public class 治疗术 implements 召唤师技能 {public v ...

最新文章

  1. Autolayout学习(1)-了解Autoreszing
  2. 阿里达摩院已经研发出第一个可控的量子比特
  3. linux 0x00,linux 学习笔记0x00
  4. HTML+CSS+JavaScript复习笔记持更(八)——CSS3常用属性之列表
  5. Android调用系统照相机
  6. Python+django网页设计入门(7):常用ORM操作
  7. ReactNative 自定义封装Radio单选组件
  8. MyBatis映射文件3(参数处理Map)
  9. 零基础学python-零基础如何开始学习 Python?看完这篇从小白变大牛!
  10. HTK---语音识别实现应用的Kit
  11. 怎么把计算机加入网络打印机共享打印机共享,打印机共享怎么设置
  12. Shashlik:Linux 上运行 Android 应用的新法子
  13. 计算机软件如何永久删除,【电脑软件教程篇】如何永久彻底清除电脑使用痕迹...
  14. 最新RiPro6.3.8 wordpress主题最新版完整修复去后门和加密文件
  15. ecshop模板支持php,让ecshop模板支持php运算
  16. MT7620a openwrt 支持32M、16M、 8M SPI flash
  17. Zabbix监控部署(内网监控外网服务器)
  18. CSS实战样式:文字两侧加居中横线
  19. 基于JAVA社区养老服务管理系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
  20. 【第004篇】Java工具类之货币大小写转换

热门文章

  1. python装饰器-python修饰器(装饰器)以及wraps
  2. python 打开当前目录的txt文件-Python - 读取其他文件夹/目录中的文本文件
  3. python程序代码大全-调试Python程序代码的几种方法总结
  4. python快乐编程—基础入门-python常用算法题
  5. python好学吗mooc中文网-Python学习第一课-MOOC嵩天
  6. python基础教程第三版豆瓣-想学python,请问有没好的书籍推荐?
  7. JS中的let和var的区别
  8. PHP学习系列(1)——字符串处理函数(3)
  9. phpstudy升级5.7
  10. RT-Thread 学习笔记(五)—— RTGUI代码解读