设计模式(一)

Java语言学习设计模式

设计模式之策略模式

策略模式是什么?可能第一次听到都会觉得很高大上,逼格很高的样子,但是,根据该设计模式的取名和生活经验也可以连蒙带猜嘛,策略是什么,就是解决问题的一种方式,就是为了达到某种目的而选择的方法。而策略模式在设计模式中就很好的体现了出了策略的含义。
菜鸟教程对策略模式的介绍如下:

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

简而言之,就是策略模式定义了算法族,并且封装起来,但是当使用该算法的用户,使用算法可以进行替换,就是说选择什么算法是客户决定的。(算法在这里指代的是一种行为,并不是具体的算法)

策略模式类图:

看了类图之后可能还是很懵逼,好的,那就举一个最简单的例子,也是策略模式最常用的例子:
计算器,对的就是那种最简单不过的计算器,只针对两个数操作的计算器,我们可以把计算器所实现的功能按照设计模式给套进去。
如图:

计算器策略模式的代码实现如下:
策略部分:
计算策略接口:

public interface Calculate {Float doWhat(Float numA, Float numB);
}

加法:

import edison.study.calcultemode.Calculate;public class CalculateAdd implements Calculate {@Overridepublic Float doWhat(Float numA, Float numB) {return numA + numB;}
}

减法:

import edison.study.calcultemode.Calculate;public class CalculateSub implements Calculate {@Overridepublic Float doWhat(Float numA, Float numB) {return numA - numB;}
}

内容部分:
计算器:

public class Calculator {private Calculate calculate;public void setCalculate(Calculate calculate) {this.calculate = calculate;}public Float doWhat(Float numA, Float numB) {return this.calculate.doWhat(numA, numB);}
}

测试主类:

import edison.study.calcultemode.impl.CalculateAdd;public class Main {public static void main(String[] args) {Calculator calculator = new Calculator();calculator.setCalculate(new CalculateAdd());Float result = calculator.doWhat(1.5F, 2.2F);System.out.println(result);}
}

测试结果:

在看完计算器这个例子之后,小伙伴们可能会有一个疑问,我们按照平时写代码的逻辑,将策略算法直接作为方法直接写,岂不是更加方便。使用策略模式之后感觉代码还更加多写了一点。

在这里我们就要思考一下了,当你所提供的功能是作为一个jar包给别人引用的时候。就拿计算器举例子,你写了一个计算器给计算中心使用,计算中心最开始只使用加法和减法,后面如果想用乘法和除法了呢。你千万别说,在计算器类里面加一个方法不就好了?OK,大兄弟你提供给别人使用的计算器是已经打成jar包,难道你让计算中心的人反编译一下?再加一个方法,显然这样是不可取的。
所以当我们使用了策略模式之后,我们直接可以和计算中心的人说,你想要乘法也好,除法也好,自己写一个,new一下就好了。这样也就很好的体现了设计模式的基本原则:“开闭原则”,也就是说:“对拓展放开,对修改关闭”。

我们平时的很多行为都可以使用策略模式:
当我们旅行时选择交通工具;
当我们选择支付方式的时候;
当我们选择听歌软件的时候;

这些都可以自己用策略模式想想,如果用代码实现,该如何实现。

模式?策略?策略模式!相关推荐

  1. C++模式学习------策略模式

    当遇到同一个对象有不同的行为,方法,为管理这些方法可使用策略模式. 策略模式就是对算法进行包装,是把使用算法的责任和算法本身分割开来.通常把一个系列的算法包装到一系列的策略类里面,这些类继承一个抽象的 ...

  2. 【设计模式】 模式PK:策略模式VS状态模式

    1.概述 行为类设计模式中,状态模式和策略模式是亲兄弟,两者非常相似,我们先看看两者的通用类图,把两者放在一起比较一下. 策略模式(左)和状态模式(右)的通用类图. 两个类图非常相似,都是通过Cont ...

  3. 模板模式(TemplateMethod)和策略(StrategyMethod)模式

    2019独角兽企业重金招聘Python工程师标准>>> 模板模式和 策略模式使用场景类似,都是把算法进行封装,可以用分离高层算法和低层的具体实现细节.都允许高层算法独立于他的具体实现 ...

  4. Java设计模式之策略模式与状态模式

    一.策略模式定义 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们之间可以相互替换,策略模式可以在不影响客户端的情况下发生变化. 好了,定义看看就完了,我知道你很烦看定义. 二.策 ...

  5. 工厂模式、策略者模式、责任链模式综合应用

    设计模式的具体运用: 简单工厂模式.策略者模式.责任链模式定义与使用 classLoader的具体运用 自定义的classloader 来动态加载类 程序功能设计: 在商城购物时,商城可能会在特殊的日 ...

  6. Java设计模式(备忘录模式-解释器模式-状态模式-策略模式-职责链模式)

    Java设计模式Ⅶ 1.备忘录模式 1.1 备忘录模式概述 1.2 代码理解 2.解释器模式 2.1 解释器模式概述 3.状态模式 3.1 状态模式概述 3.2 代码理解 4.策略模式 4.1 策略模 ...

  7. java - 策略模式、状态模式、卫语句,避免多重if-else(转)

    前言 当代码中出现多重if-else语句或者switch语句时.弊端之一:如果这样的代码出现在多处,那么一旦出现需求变更,就需要把所有地方的if-else或者switch代码进行更改,要是遗漏了某一处 ...

  8. 设计模式-策略模式,观察者模式,装饰者模式,静态工厂模式,工厂方法模式

    设计模式这个东西,永远不是单单从书本上就能获取到的东西.曾经看到一个比喻,比喻的就很巧妙,文艺复兴时期的教学方式,那时候诞生了很多巨匠,达芬奇,莫开朗基罗,拉斐尔都是在这个时期绽放光芒的巨星.有一种说 ...

  9. Java设计模式之十一 ---- 策略模式和模板方法模式

    前言 在上一篇中我们学习了行为型模式的访问者模式(Visitor Pattern)和中介者模式(Mediator Pattern).本篇则来学习下行为型模式的两个模式,策略模式(Strategy Pa ...

  10. 行为型模式:策略模式

    策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化. 通俗点,策略模式就是打折 ...

最新文章

  1. 使用T-SQL语句操作数据表-更新数据
  2. 非计算机专业的学生,从事编程工作的上升壁垒是什么?
  3. iis5顺利安装诀窍
  4. mysql用户角色权限代码_用户权限管理代码
  5. 关于LayoutParams
  6. 深入浅出InfoPath——动态获取InfoPath中的命名空间
  7. python快速排序代码_Python实现快速排序算法
  8. 5-Dockerfile文件
  9. 日本研发高精度诊疗感应器,或颠覆疾病诊疗
  10. [最小割][Kruskal] Luogu P5039 最小生成树
  11. 4 软件业务分析要点
  12. Java系统日志管理
  13. Windows提示:您的许可证即将过期
  14. 斯坦福大学公开课IOS 7学习笔记 (1)
  15. NumPy基础之大作业(Iris数据分析)
  16. idea Maven阿里云仓库和阿里spring代理仓库配置
  17. 算法创作|龟兔赛跑问题解决方法
  18. Vue控制表格列的显示隐藏
  19. 巧用第三方快速开发Android App 热门第三方SDK及框架
  20. 三十六、moved异常说明及操作

热门文章

  1. java中setLayout()方法
  2. SQL Server 2008外围应用配置器及跨库查询设置
  3. html怎么在标题上添加图片,html+css如何在图片上添加文字
  4. 哪里可以在线查询头条权重?提高头条号权重需要注意什么?
  5. 支付宝接口集成,错误代码 ILLEGAL_PARTNER_EXTERFACE 解决
  6. JPA persistence.xml 文件初学者指南
  7. tortoiseGit小白教程
  8. 使用TortoiseGit导出GIT分支差异文件
  9. 蒙迪欧致胜豪华版钥匙没电了怎么启动汽车?
  10. 优必选科技投资人夏佐全:持有11年 成创始人外最大个人股东