Java设计模式之策略设计模式

1.什么是-策略设计模式

在软件开发中常常遇到这种情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能。如查找、排序等,一种常用的方法是硬编码(Hard Coding)在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法;当然也可以将这些查找算法封装在一个统一的方法中,通过if…else…或者case等条件判断语句来进行选择。
这两种实现方法我们都可以称之为硬编码,如果需要增加一种新的查找算法,需要修改封装算法类的源代码;更换查找算法,也需要修改客户端调用代码。在这个算法类中封装了大量查找算法,该类代码将较复杂,维护较为困难。如果我们将这些策略包含在客户端,这种做法更不可取,将导致客户端程序庞大而且难以维护,如果存在大量可供选择的算法时问题将变得更加严重。

2.策略设计模式的优缺点

1.1优点

1.1.1.可以动态的改变对象的行为
1.1.2.分离业务逻辑实现和需求 

1.2缺点

1.2.1.客户端必须知道所有的策略类,并自行决定使用哪一个策略类
1.3.2.策略模式将造成产生很多策略类

2.设计模式示例

2.1.示例背景

这里的示例是以小明和女朋友出去旅游选择交通工具做背景,之前设计模式职责链的时候小明已经请假相亲,结婚啥的都已经做完了,结完婚是不是该出去度蜜月了。一天小明决定去马尔代夫度蜜月,然后选择交通方式的时候犯愁了,小明是一位选择性强迫症的人,他在考虑是坐汽车还是火车还是飞机呢。他决定吧这三个想法告诉他的老婆小红,让小红来决定(Context类来充当这个角色)。三个交通工具类分别是:Aircraft-飞机,Automobile-汽车,Train-火车,每一种交通工具的最终目的都是为了出行,所以定义一个抽象类Travel 并定义抽象方法TravelInterface让三个交通工具实现该方法

2.2.代码区域

2.2.1.创建抽象类Travel 定义抽象方法

/*** 出行抽象类*/
public abstract class Travel {/*** 出行抽象的公共接口方法*/public abstract   void TravelInterface();
}

2.2.2.创建火车类并实现抽象Travel 类

/*** 火车类*/
public class Train extends Travel  {@Overridepublic void TravelInterface() {System.out.println("我选择乘坐火车去旅游");}
}

2.2.3.创建汽车类并实现抽象Travel 类

/*** 汽车类*/
public class Automobile extends Travel  {@Overridepublic void TravelInterface() {System.out.println("我选择乘坐汽车去旅游");}
}

2.2.4.创建飞机类并实现抽象Travel 类

/*** 飞机类*/
public class Aircraft extends Travel {@Overridepublic void TravelInterface() {System.out.println("我选择乘坐飞机去旅游");}
}

2.2.4.创建实现抽象出行的实现类-小明的媳妇

/*** 控制中心*/
public class Context {public void setStrategy(Travel strategy) {this.strategy = strategy;}private Travel strategy;public Context(Travel strategy) {this.strategy = strategy;}public void TravelInterface(){this.strategy.TravelInterface();}
}

2.2.5.创建小明测试类

/*** 出行选择对应的出行方式*/
public class TourismTest {public static void main(String args[]) {Context context=null;context=new Context(new Aircraft());/*通过传递某个出行对象来决定真正出行的交通工具*/context.TravelInterface();context=new Context(new Train());context.TravelInterface();context=new Context(new Automobile());context.TravelInterface();}
}

执行思路总结:从实例中可以看出来优缺点的确很明显,本身出行的交通工具都是可以划分为交通工具类的,只是动作方法实现不同,这也就是缺点策略模式将造成产生很多策略类。有没有发现策略模式和职责链模式有几分相似之处。这里小明发起请求最终再交给小红来实现,小红就是Context 这个类。

 

转载于:https://www.cnblogs.com/david97/p/8081338.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/278776.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电脑卡死,电脑卡屏死机几个原因与解决办法必看

电脑卡屏死机几个原因与解决办法必看相信很多朋友都遇到了关于电脑卡屏死机的问题,那么该电脑卡屏死机是什么原因呢?该如何解决?那么下面给你们说说电脑卡屏死机的原因和解决方法吧,希望可以帮到你们哦!电脑卡屏死机几个原因:1 电脑中毒或中恶意软件&am…

eclipse上搭建mybatis

1..在help中打开 2.搜索mybatipse 3:功能简介 1:要查找某一个方法 在dao接口中某一个方法中 按住 Ctrl键 鼠标指到方法名称上 选择open xml 就会自动跳转 2:自动生成resultMap 安装键盘 alt / 会弹出提示框 3:引用re…

outlook工具栏显示_Outlook 2007中的待办事项栏仅显示当前任务

outlook工具栏显示One of the best new features in Outlook 2007 is the To-Do bar, where you have quick access to your calendar as well as your task list. Unfortunately, the default setting of showing all of your tasks regardless of date can be overwhelming f…

Dapper,大规模分布式系统的跟踪系统

当代的互联网的服务,通常都是用复杂的、大规模分布式集群来实现的。互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发、可能使用不同的编程语言来实现、有可能布在了几千台服务器,横跨多个不同的数据中…

在数据采集器中用TensorFlow进行实时机器学习

最新DataOps平台的真正价值,只有在业务用户和应用程序能够从各种数据源来访问原始数据和聚合数据,并且及时地产生数据驱动的认识时,才能够实现。利用机器学习(Machine Learning),分析师和数据科学家可以利用…

excel条件格式使用_如何使用条件格式在Excel中创建进度栏

excel条件格式使用Progress bars are pretty much ubiquitous these days; we’ve even seen them on some water coolers. A progress bar provides instant feedback on a given process, so why not bring some of that graphical pizzazz into your spreadsheet, using Exc…

spring技术小结

1.DI和IOC 依赖注入(Dependency Injection)还是控制反转(Inversion of Conctrol) bean通过依赖注入,注册到spring容器里面。spring容器通过控制反转,调用bean。 2.DI的方法 这里网上很多配置注入,构造方法注入,类参数注入&#xf…

raspberry pi_每日新闻摘要:新型iMac,NVIDIA的Raspberry Pi竞争对手等

raspberry piFor the morning of March 19th, 2019, Apple unveiled an updated iMac, NVIDIA showed off a Raspberry Pi competitor, Instagram will let you buy things without leaving the service, Call of Duty is coming to mobile, and a lot more. 在2019年3月19日上…

六) 条件搜索

什么是条件搜索 用关健字与指定的单列或多例进行匹配的搜索 单字段条件搜索 QueryParser queryParser new QueryParser(LuceneUtil.getVersion(),"content",LuceneUtil.getAnalyzer()); 多字段条件搜索,项目中提倡多字段搜索 QueryParser queryParser n…

Ubuntu 16.04/CentOS 6.9安装Apache压力(并发)测试工具ab

说明: ab工具已经在Apache中包含,如果不想安装Apache,那么可以使用下面方法单独安装。 安装: Ubuntu: sudo apt-get install apache2-utils CentOS: sudo yum -y install httpd-tools 官网: h…

鼠标指针放置上面,显示内容_使鼠标指针远离您键入的内容

鼠标指针放置上面,显示内容If your mouse pointer seems to constantly get in the way while you are typing, you aren’t alone… you click in the middle of some text and start typing to insert more, but the cursor stays in the way. There’s a tiny utility calle…

Java基础查漏补缺:(String篇)一个面试题问倒了我,原来String并不简单

先来一道java面试题:String s new String(“zsx”);问:创建了几个String Object? 先别往下看,想想答案 先上一个图: 如图所示,问题所示的语句创建了2个String对象和一个引用。String s new String(“zsx”); 相当于…

06 小数据池 is 和 = = 再谈编码

今日主要内容 1. 小数据池, id() 小数据池针对的是: int, str, bool 在py文件中几乎所有的字符串都会缓存. id() 查看变量的内存地址 2. is和的区别 is 比较的是内存地址 比较的是内容 当两…

geek_愚蠢的怪胎技巧:在Windows 7中启用秘密的“ How-To Geek”模式

geekWe haven’t told anybody before, but Windows has a hidden “How-To Geek Mode” that you can enable which gives you access to every Control Panel tool on a single page—and we’ve documented the secret method for you here. 我们以前没有告诉过任何人&#…

使用MetaPost绘制流程图

小白最近闲来无事,自学了一点metapost,主要用它来绘制拓扑图或流程图。小白最近在写自己从工作以来的所学,写成了一份PDF的电子文档(小白不太会使用MS Word)。小白又不想使用JPEG或PNG格式的图片作为插图,因…

基于GDAL库,读取海洋风场数据(.nc格式)c++版

经过这一段时间的对海洋数据的处理,接触了大量的与海洋相关的数据,例如海洋地形、海洋表面温度、盐度、湿度、云场、风场等数据,除了地形数据是grd格式外,其他的都是nc格式的数据。本文将以海洋风场数据为例,进行nc格式…

zune linux_快速提示:在出售Zune HD之前,先擦除所有内容

zune linuxBefore selling your Zune HD online or to another individual, you’ll probably want to erase all of its content. Here we show you how to erase all of the content through the Zune Desktop Player. 在在线上出售Zune HD或将其出售给其他人之前&#xff0c…

SSM框架——使用MyBatis Generator自动创建代码

SSM框架——使用MyBatis Generator自动创建代码 这是通过命令行, 不用ide插件. 若在IDEA中通过插件generator, 还可以参考另一篇: IDEA搭建SpringSpringMVCmybatis框架教程转载于:https://www.cnblogs.com/yadongliang/p/8097449.html

镜像VirtualBox 下安装 CentOS 7搭建python项目

一、下载和安装VirtualBox工具 CentOS 镜像 下载地址(windows x86):百度网盘 提取码:z44g 安装说明:简书-XiTeacher 二、下载OS辅助工具——putty,mtputty,winscp 下载地址(windo…

Python基础七(函数)

函数概述 函数:组织好的、可重复使用的。杉树能提高应用的模块性和代码的重复利用性。Python提供了很多的内置函数,比如len()等等,可以自行定义函数。 函数的定义 def 函数名(参数列表): #函数定义 函数体…