编写代码的时候,需要满足开闭原则,我们想要增加新的功能不能去改变源码,而应该在之前的基础上进行扩展。

加入客户有了新的需求,我们应该使用扩展的方式实现。

概述

策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

设计原则是把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口然后在类中包含这个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为。

使用策略模式可以实现:在不同的环境下可以有不同的执行方法,原理是使用多态来实现的。

策略模式的组成

策略模式中包含三部分:

  1. 抽象策略对象:可以是一个抽象类,也可以是一个接口,此部分抽取了各个策略中相同的部分,然后供子类去实现不同的功能。
  2. 具体策略对象:它封装了实现不同策略的具体算法。
  3. 环境对象:持有一个抽象策略对象的引用,可以根据不同的环境将不同的策略算法注入进来。

举例实现

假设周末想要和girl friend去超时购物,此时有多种策略供我们选择,1、开车去;2、坐公交车;3、坐地铁。

那我们如何灵活的实现想怎么去就怎么去这个功能呢?我觉得这是一个典型的策略模式示例,如下:

抽象策略对象

我们必须定义一个抽象的策略对象,这个对象中抽取了各个策略相同的额逻辑,然后供子类去实现它来完成各自不同的算法,如下:

/*** @author xxy* @date 2020/7/20* 抽象的策略对象*/
public interface IStrategy {//公共抽象逻辑:去超市void go();
}

具体策略对象

此时我们如果想去超市的话,有多种选,比如:开车、地铁、公交。

我们必须编写抽象策略类的子类,来实现这个功能,如下:

  • 开车去:
/*** @author xxy* @date 2020/7/20* 驾驶小汽车,实现了策略接口*/
public class CarStrategy implements IStrategy{@Overridepublic void go() {System.out.println("go by car...");}
}
  • 坐公交去
/*** @author xxy* @date 2020/7/20* 乘坐公交车,实现了策略接口*/
public class BusStrategy implements IStrategy {@Overridepublic void go() {System.out.println("go by bus...");}
}
  • 坐地铁去
/*** @author xxy* @date 2020/7/20* 乘坐地铁,实现了策略接口*/
public class SubwayStrategy implements IStrategy {@Overridepublic void go() {System.out.println("go by subway...");}
}

环境类

我们去超市的时候可以跟据不同的环境选择不同的乘坐方式,比如如果等公交时间长的话可以选择自己开车,如果地铁站远的话可以选择公交等等,如何优雅的实现这个功能呢?

/*** @author xxy* @date 2020/7/20* 环境对象*/
public class Context {//必须注入一个策略接口,这样就能在不同的环境下选择不同的方案了private IStrategy strategy;public Context(IStrategy strategy) {this.strategy = strategy;}public void goToSuperMarket() {strategy.go();}public static void main(String[] args) {System.out.println("我想开车去超市....");Context context1 = new Context(new CarStrategy());context1.goToSuperMarket();System.out.println("我想坐公交去超市....");Context context2 = new Context(new BusStrategy());context2.goToSuperMarket();System.out.println("我想坐地铁去超市...");Context context3 = new Context(new SubwayStrategy());context3.goToSuperMarket();}
}

执行结果如下:

这样就能根据不同的情况传进来不同的实现逻辑,之后如果还有不同的实现可以继续去实现我们的策略基类,比如我想开私人飞机去。。。

优点

  • 能够提高代码的扩展性,符合开闭原则。
  • 可以避免多重if-else的判断,并且如果多重判断的话,在增加新的功能的时候必须修改源码中的判断语句,不满足开闭原则。

缺点

我们在使用策略模式的时候,必须知道他的各个实现类的算法,并且清楚地知道他们的区别,并自行决定选择他们的哪一个。

一文读懂设计模式--策略模式相关推荐

  1. 一文搞懂设计模式--模板模式

    Hi,大家好.今年的天气实在是太热了,七月份的厦门晒得我觉得身上冒出了烤肉香,不知道各位是否安好,但是在再热的天气也不能阻止我们学习的热情(doge).今天的主题是模板(Template Method ...

  2. 一文读懂NoSQL的模式 | 时光机

    戳蓝字"CSDN云计算"关注我们哦! 时光机:搭载这部时光机,带您回顾<程序员>大量优秀文章,重温经典技术干货,我们发现硬核技术永不过时,对于get要点.solve难题 ...

  3. 一文读懂设计模式--适配器模式

    概述 Adapter pattern 适配器模式:将一个类的接口转换成客户希望的另一个接口,适配器模式让那些接口不兼容的类可以一起工作. 上边定义说到的接口只是一个抽象的表示,可以是接口,也可以是类, ...

  4. 教你如何一篇博客读懂设计模式之—--原型模式

    教你如何一篇博客读懂设计模式之----原型模式 what:是什么 原型模式: 用于创建重复的对象,既不用一个属性一个属性去set和get,又不影响性能,原型模式产生的对象和原有的对象不是同一个实例,他 ...

  5. 教你如何一篇博客读懂设计模式之—--工厂模式

    一篇博客读懂设计模式之-工厂模式 工厂模式在我们日常开发的时候经常用到,相信大家都有了一定的了解,工厂模式是一种创建对象的设计模式,它提供一种创建对象的最佳方式. 主要过程是: 定义一个创建对象的接口 ...

  6. 一篇博客读懂设计模式之---委派模式

    一篇博客读懂设计模式之-委派模式 委派模式可能大家听起来不太熟悉,但是在代码开发的时候却很好用,下面从几个方面来介绍一下 what:是什么? 委派模式:顾名思义,委托其他对象或者实例来帮我们完成任务, ...

  7. 一文读懂FTP的主动模式和被动模式

    文章目录 一文读懂FTP的主动模式和被动模式 一.引子 二.主动模式和被动模式结合TCP的三次握手详解 一文读懂FTP的主动模式和被动模式 一.引子 又来到了一文读懂系列文章,哈哈,昨天刚整理完FTP ...

  8. 人工智能(8)---一文读懂人工智能产业链:基础技术、人工智能技术及人工智能应用

    一文读懂人工智能产业链:基础技术.人工智能技术及人工智能应用 概要:针对人工智能产业链,主要有三个核心:基础技术.人工智能技术及人工智能应用,本文将从主要从这三个方面进行梳理 人工智能(Artific ...

  9. 腾讯资深架构师干货总结:一文读懂大型分布式系统设计的方方面面

    1.引言 我们常常会听说,某个互联网应用的服务器端系统多么牛逼,比如QQ.微信.淘宝.那么,一个大型互联网应用的服务器端系统,到底牛逼在什么地方?为什么海量的用户访问,会让一个服务器端系统变得更复杂? ...

最新文章

  1. python使用fpdf生成发票格式的pdf文件包含:文字、图片logo、表格、条形码等;
  2. 俯卧撑打造男人结实臂膀
  3. 创建dynamics CRM client-side (四) - Namespace Notation in JS
  4. RTEMS实时操作系统精要(2)-FLAGS、EFLAGS寄存器
  5. Vue-CLI——自定义title解决方案
  6. Qt Creator使用调试助手
  7. C++创建一个特殊的类
  8. CentOS压缩命令zip
  9. ubuntu安装postman
  10. 理论塔板数 matlab,matlab作图法计算精馏理论板数
  11. linux eth em,em改eth导致网卡无法启动
  12. linux下ftp权限控制
  13. ICESat 数据介绍
  14. VsCode必备插件
  15. postgresql统一把字段小写转大写
  16. 2019网络直播稳中有变:直播带货火出圈 5G带来弯道超车新机会
  17. 一文读懂多架构的中断控制器
  18. 制作android布局模板,Android Studio自定义模板 写页面竟然可以如此轻松
  19. 上古5各技能训练师地点
  20. [二] Numpy数据存取与函数

热门文章

  1. Coursera-Neural Networks by Geoffrey Hinton
  2. 嵌入式Linux应用开发学习(一)—嵌入式编程基本知识
  3. UWB室内定位系统的优势与好处
  4. Linux中alias设置重命名出现 -bash: alias :XXX :not found 问题的解决
  5. 【tensorflow学习之路】如何使用gpu进行运算
  6. Java环境下GDAL / OGR环境配置与入门
  7. 计算机主机怎么连接显示器,一台主机两个显示器怎么连接 一台主机两个显示器如何设置...
  8. 设置漂亮的eclipse主题(Theme)风格
  9. 用实例给新手讲解易懂的RSA加密解密算法
  10. Ubuntu20 uuv_simulator 安装