策略模式(Strategy Pattern)就是一个类的行为或其算法封装起来,在运行时可以更改,相互替换,最终达到何种目的,取决于调用者传入的要求条件。属于行为型模式。
说起这个,也正是因为去年开会的时候被架构的策略模式给忽悠住了,我才决定把设计模式优先提到学习计划前列,干脆就把所有的模式全了解一遍。
在系统流程中,策略其实就是我们大量if else 的替代品,比如昨天文章Java-102-设计模式-17-命令模式 中的命令管理器,我们就使用了swtich语法来控制命令走不同的实现逻辑。
就跟足浴中心按摩一样,大堂经理就是策略类。你告诉她喜欢啥样的技师,她就给你推来对应的类型,最终目的都是养生。
现在假设阿宾想要找个女的结婚,但是在犹豫娶什么条件的女的。不管啥女的,最终目的都是结婚。
代码实现:
一、阿宾根据不同的条件找到对应条件的女人结婚
1、将女人抽象到interface,并实现三个女人,有一个共同方法:结婚
packagecom.xing.design.strategy; publicinterfaceWoman { voidmarry(); } packagecom.xing.design.strategy; publicclassCangjingkongimplementsWoman{ publicvoidmarry(Stringname) { System.out.println("我是苍老师,"+name+"因为我活儿好和我结婚啦"); } } packagecom.xing.design.strategy; publicclassGaoyuanyuanimplementsWoman{ publicvoidmarry(Stringname) { System.out.println("我是高老师,"+name+"因为我有气质和我结婚啦"); } } packagecom.xing.design.strategy; publicclassLiuyanimplementsWoman{ publicvoidmarry(Stringname) { System.out.println("我是柳老师,小名有容,"+name+"因为我胸大和我结婚啦"); } }
2.搞一个策略类,根据调用者传入的条件控制去哪个算法
packagecom.xing.design.strategy; publicclassStrategyManager { publicstaticvoidmarry(Stringname, Stringcontidion) { if("活儿好".equals(contidion)) { newCangjingkong().marry(name); }elseif("有气质".equals(contidion)) { newLiuyan().marry(name); }elseif("胸大".equals(contidion)) { newGaoyuanyuan().marry(name); }else { System.out.println("看看自己屌样哇,还要求呢"); } } }
3.编写main方法测试
packagecom.xing.design.strategy; publicclassStrategyDemo { publicstaticvoidmain(String[] args) { Stringname="阿宾"; System.out.println(name+"喜欢活儿好的,我要找活好的结婚"); StrategyManager.marry(name, "活儿好"); Stringname2="秀儿"; System.out.println(name2+"喜欢有气质的,我要找有气质的结婚"); StrategyManager.marry(name2, "有气质"); Stringname3="江涛"; System.out.println(name3+"喜欢🐻大的,我要找🐻大的的结婚"); StrategyManager.marry(name3, "胸大"); Stringname4="小热"; System.out.println(name4+"喜欢完美的,我要找完美的结婚"); StrategyManager.marry(name4, "完美的"); } }
4.测试结果
几位屌丝(调用者)调用同一个策略类,但是根据各自的喜好,都达成了结婚的目的。三种策略(三位老师)都可以实现一个特定的目的(结婚),使用哪种策略取决于调用者(屌丝们)传入哪种要求(喜好条件)。
总结:
策略模式,很常用
END