一文读懂设计模式--策略模式
编写代码的时候,需要满足开闭原则,我们想要增加新的功能不能去改变源码,而应该在之前的基础上进行扩展。
加入客户有了新的需求,我们应该使用扩展的方式实现。
概述
策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
设计原则是把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口然后在类中包含这个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为。
使用策略模式可以实现:在不同的环境下可以有不同的执行方法,原理是使用多态来实现的。
策略模式的组成
策略模式中包含三部分:
- 抽象策略对象:可以是一个抽象类,也可以是一个接口,此部分抽取了各个策略中相同的部分,然后供子类去实现不同的功能。
- 具体策略对象:它封装了实现不同策略的具体算法。
- 环境对象:持有一个抽象策略对象的引用,可以根据不同的环境将不同的策略算法注入进来。
举例实现
假设周末想要和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的判断,并且如果多重判断的话,在增加新的功能的时候必须修改源码中的判断语句,不满足开闭原则。
缺点
我们在使用策略模式的时候,必须知道他的各个实现类的算法,并且清楚地知道他们的区别,并自行决定选择他们的哪一个。
一文读懂设计模式--策略模式相关推荐
- 一文搞懂设计模式--模板模式
Hi,大家好.今年的天气实在是太热了,七月份的厦门晒得我觉得身上冒出了烤肉香,不知道各位是否安好,但是在再热的天气也不能阻止我们学习的热情(doge).今天的主题是模板(Template Method ...
- 一文读懂NoSQL的模式 | 时光机
戳蓝字"CSDN云计算"关注我们哦! 时光机:搭载这部时光机,带您回顾<程序员>大量优秀文章,重温经典技术干货,我们发现硬核技术永不过时,对于get要点.solve难题 ...
- 一文读懂设计模式--适配器模式
概述 Adapter pattern 适配器模式:将一个类的接口转换成客户希望的另一个接口,适配器模式让那些接口不兼容的类可以一起工作. 上边定义说到的接口只是一个抽象的表示,可以是接口,也可以是类, ...
- 教你如何一篇博客读懂设计模式之—--原型模式
教你如何一篇博客读懂设计模式之----原型模式 what:是什么 原型模式: 用于创建重复的对象,既不用一个属性一个属性去set和get,又不影响性能,原型模式产生的对象和原有的对象不是同一个实例,他 ...
- 教你如何一篇博客读懂设计模式之—--工厂模式
一篇博客读懂设计模式之-工厂模式 工厂模式在我们日常开发的时候经常用到,相信大家都有了一定的了解,工厂模式是一种创建对象的设计模式,它提供一种创建对象的最佳方式. 主要过程是: 定义一个创建对象的接口 ...
- 一篇博客读懂设计模式之---委派模式
一篇博客读懂设计模式之-委派模式 委派模式可能大家听起来不太熟悉,但是在代码开发的时候却很好用,下面从几个方面来介绍一下 what:是什么? 委派模式:顾名思义,委托其他对象或者实例来帮我们完成任务, ...
- 一文读懂FTP的主动模式和被动模式
文章目录 一文读懂FTP的主动模式和被动模式 一.引子 二.主动模式和被动模式结合TCP的三次握手详解 一文读懂FTP的主动模式和被动模式 一.引子 又来到了一文读懂系列文章,哈哈,昨天刚整理完FTP ...
- 人工智能(8)---一文读懂人工智能产业链:基础技术、人工智能技术及人工智能应用
一文读懂人工智能产业链:基础技术.人工智能技术及人工智能应用 概要:针对人工智能产业链,主要有三个核心:基础技术.人工智能技术及人工智能应用,本文将从主要从这三个方面进行梳理 人工智能(Artific ...
- 腾讯资深架构师干货总结:一文读懂大型分布式系统设计的方方面面
1.引言 我们常常会听说,某个互联网应用的服务器端系统多么牛逼,比如QQ.微信.淘宝.那么,一个大型互联网应用的服务器端系统,到底牛逼在什么地方?为什么海量的用户访问,会让一个服务器端系统变得更复杂? ...
最新文章
- python使用fpdf生成发票格式的pdf文件包含:文字、图片logo、表格、条形码等;
- 俯卧撑打造男人结实臂膀
- 创建dynamics CRM client-side (四) - Namespace Notation in JS
- RTEMS实时操作系统精要(2)-FLAGS、EFLAGS寄存器
- Vue-CLI——自定义title解决方案
- Qt Creator使用调试助手
- C++创建一个特殊的类
- CentOS压缩命令zip
- ubuntu安装postman
- 理论塔板数 matlab,matlab作图法计算精馏理论板数
- linux eth em,em改eth导致网卡无法启动
- linux下ftp权限控制
- ICESat 数据介绍
- VsCode必备插件
- postgresql统一把字段小写转大写
- 2019网络直播稳中有变:直播带货火出圈 5G带来弯道超车新机会
- 一文读懂多架构的中断控制器
- 制作android布局模板,Android Studio自定义模板 写页面竟然可以如此轻松
- 上古5各技能训练师地点
- [二] Numpy数据存取与函数
热门文章
- Coursera-Neural Networks by Geoffrey Hinton
- 嵌入式Linux应用开发学习(一)—嵌入式编程基本知识
- UWB室内定位系统的优势与好处
- Linux中alias设置重命名出现 -bash: alias :XXX :not found 问题的解决
- 【tensorflow学习之路】如何使用gpu进行运算
- Java环境下GDAL / OGR环境配置与入门
- 计算机主机怎么连接显示器,一台主机两个显示器怎么连接 一台主机两个显示器如何设置...
- 设置漂亮的eclipse主题(Theme)风格
- 用实例给新手讲解易懂的RSA加密解密算法
- Ubuntu20 uuv_simulator 安装