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…

在数据采集器中用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…

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日上…

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

鼠标指针放置上面,显示内容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…

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…

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

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

ios 取消交互_每日新闻摘要:Google披露了iOS“无交互”漏洞

ios 取消交互Google, through its Project Zero initiative, disclosed six vulnerabilities in iOS. In each case, a hacker could execute remote code on someone’s iPhone without any interaction by the user. Apple’s iOS 12.3 fixes five of the issues. 谷歌通过其…

Ubuntu 16.04使用timedatectl进行管理时间(UTC/CST)(服务器/桌面)

说明:16.04开始,systemd接管了系统之后就不再使用/etc/default/rcS和ntpdate、dpkg-reconfigure tzdata进行时间的管理,所以在这些地方设置是无效的,标准的写法是使用timedatectl进行管理。且经过测试hwclock操作硬件BIOS&#xf…

黑客攻防:从入门到入狱_每日新闻摘要:游戏服务黑客被判入狱27个月

黑客攻防:从入门到入狱On Christmas day, 2013, many delighted people opened up new Xbox and Playstation gifts. That excitement turned to disappointment when they were unable to log onto game services and play. Now the hacker responsible will spend 27 months …

如何下载手机的App Store中不再存在的应用程序

Smartphone app stores are well established at this point, and as much as we love to see new apps become available, that also means the inevitable: sometimes apps go away. Here’s what you can do if your favorites disappear. 在这一点上,智能手机应…

Q_learning简介与实例

1、算法思想 QLearning是强化学习算法中value-based的算法,Q即为在某一环境下,Q(state,action)在某一时刻的 s 状态下(s∈S),采取 动作a (a∈A)动作能够获得收益的期望,环境会根据agent的动作反馈相应的回…

2-1 gradle安装

因为Gradle是基于JVM的,所以一定要确保本机已经安装了JDK,我们可以通过java -version来验证一下是否已经安装了JDK。 bin目录里面是两个可执行文件,一个是Windows下面的可执行文件,还有一个就是类Unix文件系统的可执行文件。所有的…

Django中session和cookie简单的使用

一、简单的理解 session和cookie是request下的两个对象,操作他们的值就是在操作字典,设置他们的属性就是调用方法。 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。Web应用程序是使用HTTP协议传输…

摄影中的曝光补偿是什么?

When you use your camera in some automatic modes like Program—or one of the semi-manual modes like Aperture Priority or Shutter Speed Priority—you don’t give up total control over everything: you can still control the exposure using exposure compensatio…