学妹面试拼刀刀被问Java策略模式是什么鬼?哈哈哈哈

学妹面试拼刀刀被问Java策略模式是什么鬼?哈哈哈哈 学妹跟我讲怎么机智面对的 我呆了!

🧾1.策略模式到底是什么鬼捏???👀

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

简单的说,策略模式代表了一类算法的通用解决方案,你可以在运行时选择使用哪种解决方案。

策略模式的重心📚

策略模式的重心不是如何实现算法, 而是如何组织、调用这些算法, 从而使得程序结构更加灵活,具有更好的维护性和扩展性。

算法的平等性📚

策略模式一个很大的特点就是各个策略算法的平等性。对于一系列具体的策略算法,地位都是一样的,因此可以实现算法之间可以互相替换。所有的策略算法在实现上也是相互独立的,相互之间是没有依赖的。所以可以这样描述这一系列策略算法:策略算法是相同行为的不同实现。【获取资料】

运行时策略的唯一性📚

运行期间,策略模式在每一个时刻只能使用一个具体的策略实现对象,虽然可以动态地在不同的策略实现中切换,但是同时只能使用一个。

公有的行为📚

经常见到的是,所有的具体策略都有一些公有的行为。这时候,就应该把这些公有的行为放到共同的抽象策略角色

Strategy类里面。这时不能使用接口,应该使用抽象类来实现。

🧾2.策略模式的结构

策略模式包含三部分内容:(如下图所示)

  • a.一个或多个使用策略对象的客户.(环境角色)

  • b.一个代表某个算法的接口, 它是策略模式的接口. (抽象策略角色)

  • c.一个或多个该接口的具体实现, 它们代表了算法的多种实现.(具体策略角色)


🧾3.策略模式的应用

  • a.容错恢复机制, 程序运行的时候, 如果发生某种错误, 系统并不会直接挂掉或者说影响系统的其他功能点.
    而是系统可以容忍这样的错误, 并且事先提供好了这种容错恢复机制, 来使得程序正常的运行下去.

  • 例如: 一个系统要对所有的操作进行日志记录, 且需要把日志记录落库, 方便后续的使用, 但是在把日志记录落库的时候,
    可能会发生错误, 如数据库出现问题, 那就先可以记录在文件里面, 等到数据库问题修复, 再把文件中的日志记录同步到数据库中去.

对于这样的功能设计, 可以采用策略设计模式, 根据需要在运行期间进行动态的切换.

  • b.假设现在要设计一个会员机制的购物系统, 对本系统的所有SVIP提供打八折的购物优惠,
    对本系统的所有VIP提供打九折的购物优惠, 对非会员购物不打折. 那么对于这样的系统功能设计, 也可以采用策略模式来设计.

  • c.使用不同的条件(物品的重量或者颜色等)来筛选库存中的物品, 可以将这一模式应用到更广泛的领域,
    比如使用不同的标准来验证输入的有效性, 使用不同的方式来分析或者格式化输入.

🧾 4.策略模式Demo

假设现在需要根据业务的需求,对调用接口传进来的参数,选择合适的策略进行处理,这里假设有策略一和策略二。

Client:

/*** @author lyh* @version v-1.0.0* @since 2021/6/2*/
public class Client {public static void main(String[] args) {//根据需要客户自行选择策略//加入Java开发交流君样:756584822一起吹水聊天//选择策略1StrategyObj strategyOne = new StrategyObj(new StrategyOne());System.out.println(strategyOne.strategy("one"));//选择策略2StrategyObj strategyTwo = new StrategyObj(new StrategyTwo());System.out.println(strategyTwo.strategy("two"));}
}输出:
执行策略1!
执行策略2!Process finished with exit code 0

策略接口:

/*** @desc:策略接口*/
public interface Strategy {String execute(String s);
}/*** @desc:策略接口封装*/
public class StrategyObj {private final Strategy strategy;public StrategyObj(Strategy v) {this.strategy = v;}public String strategy(String s) {return strategy.execute(s);}}

策略实现:

/*** @desc:策略一*/
public class StrategyOne implements Strategy {@Overridepublic String execute(String s) {return "执行策略1!";}
}/*** @desc:策略二*/
public class StrategyTwo implements Strategy {@Overridepublic String execute(String s) {return "执行策略2!";}
}

🧾5.使用Lambda表达式

通过上面的demo应该可以意识到Strategy是一个函数式接口;除此之外,它还与Predicate<String>具有同样的函数描述。这意味着我们不需要声明新的类来实现不同的策略,通过直接传递Lambda表达式就能达到同样的目的且更简洁。


public class Client {public static void main(String[] args) {StrategyObj strategyOne = new StrategyObj((String s) -> {return "执行策略1";});System.out.println(strategyOne.strategy("one"));//加入Java开发交流君样:756584822一起吹水聊天StrategyObj strategyTwo = new StrategyObj((String s) -> {return "执行策略2";});System.out.println(strategyTwo.strategy("two"));}
}

Lambda表达式避免了采用策略设计模板时僵化的模板代码。仔细看上面的代码会发现,Lambda表达式实际已经对策略进行了封装, 这就是创建策略设计模式的初衷.

🧾6.策略模式的优缺点

优点

  • a.使用策略模式可以避免使用多重条件if…else if…else语句, 多重条件不易维护且代码可读性差.

  • b.策略模式提供了管理相关的算法族的办法. 策略类的等级结构定义了一个算法或者行为族. 恰当使用继承可以把公共的代码移到父类里面, 从而避免代码重复


缺点

  • a.客户端必须知道所有的策略类, 并自行决定使用哪一个策略类. 这就意味着客户端必须理解这些算法的区别, 以便适时选择恰当的算法类. 换言之, 策略模式只适用于客户端知道算法或行为的情况.

  • b.由于策略模式把每个具体的策略实现都单独封装成类, 如果备选的策略很多的话, 那么对象的数目就会很多.

最后,祝大家早日学有所成,拿到满意offer

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

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

相关文章

基于Visual C++2010与windows SDK fo windows7开发windows7平台的tabletpc应用(1)-手写数学公式输入...

搭建好Visual C2010与windows SDK fo windows7的开发平台以后&#xff0c; 小试牛刀&#xff0c;检验下开发windows7的下的tabletpc应用&#xff0c;这个东西财务记账比较多&#xff0c; 大家先看效果&#xff0c;然后讲解详细代码 详情请见代码注释 // Windows 头文件 #includ…

你所阅读的,决定你是什么样的人

全世界只有3.14 % 的人关注了爆炸吧知识真正决定人与人之间的差距的&#xff0c;其实是我们对事物的见识与内心的格局&#xff0c;见识的深浅决定人生的深浅&#xff0c;格局的大小决定了人生之路是宽是窄。今天给大家推荐几个有深度、有想法的公众号&#xff0c;希望能够给你带…

下图为双总线结构机器的数据通路_海康机器人为物流加码:进击吧,双11新“打工人”...

今年的双11开启了迄今最长“战线”据国家邮政局初步预计&#xff0c;11月1日-16日全行业处理的邮(快)件业务量将达57.8亿件同比增长47%左右双11期间业务量将达29亿件比去年同期增长28%庞大的业务量和超快的物流速度&#xff0c;离不开智能终端、物联网、大数据等多重技术的支持…

设计模式之状态

状态模式介绍状态模式是一种行为设计模式&#xff0c;让你能在一个对象的内部状态变化时改变其行为&#xff0c;使其看上去就像改变了自身所属的类一样。根据状态不同&#xff0c;行为也不同状态模式描述的是一个行为下的多种状态变更&#xff0c;比如我们最常见的一个网站的页…

故障排除

公司各办事处反映收不到邮件。测试时发现都正常&#xff0c;可是为什么收不到邮件呢&#xff0c;后来再测试&#xff0c;逐一排除&#xff0c;可能是防火墙或所在计算机的问题。可还是不能找到具体的问题所在。于是请公司一个高手协助搞定。只要重新创建一条规则即可&#xff0…

一个不成功人士的“成功之道”

有人这样说我&#xff1a;“他是只自学不成才。”听到这样不中听的话&#xff0c;我一点也不生气。因为&#xff0c;人家说的的确是事实&#xff0c;我的确是一个不成才的人&#xff0c;的确是一个不成功人士。1977年&#xff0c;我高中毕业&#xff0c;参加了第一届恢复的高考…

阿里最新面试必备项之Java的String类,持续更新中!

最新腾讯面试必备项之Java的String类&#xff0c;持续更新中&#xff01; 1.1 String的特性 String类&#xff1a;代表字符串。Java程序中的所有字符串字面值&#xff08;如“abc”&#xff09;都作为此类的实例实现。 String是一个final类&#xff0c;代表不可变的字符序列。…

硬盘安装 solaris

硬盘安装solaris10 1、分区简介&#xff1a;(以我的硬盘为例&#xff0c;只做参考)  第一主分区 10G C盘 FAT32格式 安装WINDOWS XP  第二主分区 15G 空闲未分配 准备留给Solaris10  扩展分区分为三个逻辑盘&#xff1a;  D盘 24G FAT32格式  E盘 26G FAT32格式  F…

Juster的MVP奋斗之路

大家好是朱震&#xff08;juster zhu&#xff09;MVP唯一id是5004326&#xff0c;这里主要给大家分享一下参选上MVP喜悦。首先非常感谢大伙对我的支持&#xff0c;在过去的8个多月里几乎每天都在写博客和做视频以及回答技术问题中度过。整个过程非常艰苦&#xff0c;身体不好真…

接地脚是什么意思_帮个忙老铁们 急急急!!!什么叫相地接错并缺地。?_天涯问答_天涯社区...

偶的上帝电路地线&#xff1a;在电路设计时&#xff0c;主要是防止干扰与提高无线电波的辐射效率。地线被广泛作为电位的参考点&#xff0c;为整个电路提供一个基准电位。此时&#xff0c;地线未必与真正的大地相连&#xff0c;而往往与输入电源线的一根相连(通常是零线)&#…

换工作了,开始用金蝶的BOS了,好多东西都要学啊!

原来一直搞Web方面的&#xff0c;现在开始搞金蝶那一套了&#xff0c;金蝶EAS BOS&#xff0c;原来都没有接触过的&#xff0c;要好好学习哦&#xff01;感觉金蝶的东东还挺好的哦&#xff01;转载于:https://blog.51cto.com/huqianhao/955253

被嫌弃的蝗虫的一生

全世界只有3.14 % 的人关注了爆炸吧知识转载来源&#xff1a;混子曰部分素材源于网络&#xff0c;版权归原作者所有如有侵权请留言联系删除&#xff0c;感谢合作选购数学科普正版读物严选“数学思维好物”送给孩子的阅读礼物 | 办公室神器有益孩子一生的玩具 | 居家高科…

Windows Server 2008关闭默认windows共享

Windows启动时都会默认打开admin$ ipc$ 和每个盘符的共享&#xff0c;对于不必要的默认共享&#xff0c;一般都会把它取消掉&#xff0c;可当又需要打开此默认共享时&#xff0c;又该从哪里设置呢&#xff0c;一般来说有两个地方&#xff0c;MSDOS命令和计算机管理共享文件夹&a…

直接裂开!京东二面被问SpringBoot整合MongoDB,我不会啊

开始进入正题 一、技术介绍 SpringBoot整合MongoDB的实现步骤一、技术介绍1.MongoDB是什么&#xff1f;二、使用步骤1.MongoDB是什么&#xff1f; MongoDB&#xff08;来自于英文单词“Humongous”&#xff0c;中文含义为“庞大”&#xff09;是可以应用于各种规模的企业、各…

3/15/2010

ER - Error EecoveryA4 - ArrowHead 转载于:https://www.cnblogs.com/climberluoxi/archive/2010/03/15/1686725.html

textjoin去重_SuperJoinText这个函数,弥补了TEXTJOIN的缺憾

自从TextJoin函数处理&#xff0c;我感觉Excel文本处理问题&#xff0c;减少了一半&#xff0c;真的特别好用!但也有一些不足的地方&#xff0c;比如能不能直接对满足条件的数据去重后合并&#xff0c;直接忽略FALSE等&#xff0c;当然你可能会说其他函数组合可以实现&#xff…

复工后,看看他们都是怎么上班的!

全世界只有3.14 % 的人关注了爆炸吧知识来源&#xff1a;大叔爱吐槽 人民日报本周全国各地终于逐步复工&#xff01;听&#xff01;小伙伴在召唤你&#xff01;你大概从未想过&#xff0c;有一天自己竟会盼望上班&#xff1f;困守家中的20多天&#xff0c;积累了天量防疫知识&a…

使用 OpenLDAP 集中管理用户帐号

关键字&#xff1a; OpenLDAP ReiserFS SCTP nmon 正则表达式 使用轻量级目录访问协议&#xff08;LDAP&#xff09;构建集中的身份验证系统可以减少管理成本&#xff0c;增强安全性&#xff0c;避免数据复制的问题&#xff0c;并提高数据的一致性。随着 Linux&reg; 的不断…

.NET Core 2.1 容器镜像将从 Docker Hub 中删除

.NET Core 2.1 容器镜像将从 Docker Hub 中删除Richard 2021 年 8 月 16 日从 8 月 21 日开始&#xff0c;.NET Core 2.1 Docker 容器镜像将不再在 Docker Hub 上可用&#xff0c;而只能在 Microsoft Container Registry (MCR) 上使用。此更改之前已通过 dotnet/dotnet-docker …

【每日分享】我做程序员那些年犯下的罪,此时此刻我自己的笑出猪叫~

以前我刚入行&#xff0c;总是会犯这样几个常见错误&#xff0c;后面想起来是真的SB。当然每个程序员会犯错&#xff0c;重要的是从中吸取教训&#xff0c;得到成长。那么这些错误到底是什么呢&#xff1f;我来给大家盘点一下&#xff01;&#xff01;&#xff01; 当我感觉我…