详解Java策略模式
详解Java策略模式
一、策略模式到底是什么?
策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。
简单的说,策略模式代表了一类算法的通用解决方案,你可以在运行时选择使用哪种解决方案。
策略模式的重心
策略模式的重心不是如何实现算法, 而是如何组织、调用这些算法, 从而使得程序结构更加灵活,具有更好的维护性和扩展性。
算法的平等性
策略模式一个很大的特点就是各个策略算法的平等性。对于一系列具体的策略算法,地位都是一样的,因此可以实现算法之间可以互相替换。所有的策略算法在实现上也是相互独立的,相互之间是没有依赖的。所以可以这样描述这一系列策略算法:策略算法是相同行为的不同实现。
运行时策略的唯一性
运行期间,策略模式在每一个时刻只能使用一个具体的策略实现对象,虽然可以动态地在不同的策略实现中切换,但是同时只能使用一个。
公有的行为
经常见到的是,所有的具体策略都有一些公有的行为。这时候,就应该把这些公有的行为放到共同的抽象策略角色
Strategy类里面。这时不能使用接口,应该使用抽象类来实现。
二、策略模式的结构
策略模式包含三部分内容:(如下图所示)
三、策略模式的应用
四、策略模式Demo
假设现在需要根据业务的需求,对调用接口传进来的参数,选择合适的策略进行处理,这里假设有策略一和策略二。
Client:
/** * @author lyh * @version v-1.0.0 * @since 2021/6/2 */ public class Client { public static void main(String[] args) { //根据需要客户自行选择策略 //加入Java开发交流君样:756584822一起吹水聊天 //选择策略1 StrategyObj strategyOne = new StrategyObj(new StrategyOne()); System.out.println(strategyOne.strategy("one")); //选择策略2 StrategyObj 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); }//加入Java开发交流君样:756584822一起吹水聊天 }
策略实现:
/** * @desc:策略一 */ public class StrategyOne implements Strategy { @Override public String execute(String s) { return "执行策略1!"; } } /** * @desc:策略二 */ public class StrategyTwo implements Strategy { @Override public String execute(String s) { return "执行策略2!"; } }
五、使用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表达式实际已经对策略进行了封装, 这就是创建策略设计模式的初衷.
六、策略模式的优缺点
优点
缺点
到此这篇关于详解Java策略模式的文章就介绍到这了,更多相关Java策略模式内容请搜索趣讯吧以前的文章或继续浏览下面的相关文章希望大家以后多多支持趣讯吧!
推荐阅读
-
洗衣机不脱水了是怎么回事(洗衣机不甩干的处理方法)
洗衣机作为大家日常生活必备的家用电器,其利用率频繁,难免会因为机械磨损、缺乏润滑油、机件老化、弹簧疲劳变形等原因,出现各种不正...
-
电子表格零基础自学教程(小白也能学明白)
可能很多人(包括我)觉得Excel不就是做个表吗,没什么好学的。然而很多大型企业在面试的时候还是会问,“会Excel吗?”“会...
-
笔记本电脑报价大全(联想笔记本多少钱)
(注意:建议在旗舰店、官方旗舰店、官网购买) 一、游戏本设计本、办公本推荐如下: 华为品牌:(全球第一大电信设备商) 1...
-
煲机软件哪个好(让耳机有个思想准备)
《无间道》中陈永仁与刘建明有过一句经典对白&mdash;&mdash;“高音甜、中音准、低音沉,总之一个词通透”。这一句话也一...
-
viewsonic平板电脑(viewsonic平板电脑刷机)
ViewSonic是一个视讯品牌,中文名字:优派。 ViewSonic 一、读音:英[vju:][?s?n?k],美[vj...
-
采访麦克风户外哪款好(讯飞智能无线麦克风C1采访神器)
对于视频创作者、直播工作者、远程培训老师、记者等媒体工作者来说,工作过程中,最让人费心的莫过于如何确保收音纯正、字幕快速生成、...
-
电脑硬件配置怎么查(详述两招快速查看电脑配置参数信息)
大家好,今天跟大家分享两个快速查看电脑配置参数信息的办法。 操作步骤如下: 1右击电脑屏幕最下方任务栏左侧的电脑徽标按钮,...
-
数据线没坏但充不上电怎么办(数据线充不上电处理方法)
苹果充电器突然充不上电是比较尴尬的问题,首先看自己的充电器数据线是不是原装,如果非原装在第一次充电时,苹果手机会提示你是否要适...
-
电脑开机出现黑屏如何处理(电脑不能开机黑屏解决方法)
电脑不能开机或者开机以后黑屏怎么解决?这里收集了所有常见的维修方法,看完秒变维修高手,实在是一篇不能错过的电脑维修教程。简单易...
-
手机宝典怎么搞(小米手机性能优化宝典)
别再总是抱怨手机卡顿,系统臃肿,反应慢,现在看完这篇文章,你会发现你并不了解小米手机,当然,文中许多方法并不是仅仅适用于小米手...