
设计模式之策略模式学习笔记
发布日期:2021-05-06 23:31:39
浏览次数:32
分类:精选文章
本文共 1859 字,大约阅读时间需要 6 分钟。
前言
我想大家都加班写过“业务代码”,一大堆的if else,甚至if里面套if…代码不得已变得十分臃肿,对应的维护成本也有所增加。而策略模式,就是为了解决违反了开放封闭原则的这一问题。
定义
定义一系列算法,把每个算法都封装起来,并使之可以相互替换。策略模式可以使算法可以独立于用户,来独立的变化
结构图
角色拆解分析:
举栗实现
这里就用哈士奇大G举栗吧,毕竟二哈是一个神奇的物种,狗怂话多,上帝向人间洒下了智慧,唯独二哈却撑起了伞。还有狂风桑配音的那两只吵架的柯基(劳资把你周围的空气吃光,把你给憋死!),一场嘴遁大战即将开战!没有人一上来就放大的,否则会被喷死的。要想取胜,就得制定应敌策略。
1.Stragety策略接口
策略接口定义了一个放技能的方法
public interface FightStratety { public void fighting();//放技能的方法}
2.ConcreteStragety具体的策略实现
这里制定了2个级别的策略,分别是普通策略和终极策略,用来对付不同水准的对手。
/** * 普通策略,大G先用爪子试探下对手水平 */public class CommenStratety implements FightStratety { @Override public void fighting() { System.out.print("对手太水没必要放大招,一边走位一边A就好"); }}
/** * 终极策略,柯基要把大G周围的空气吃光,想把大G憋死 */public class FinalStratety implements FightStratety { @Override public void fighting() { System.out.print("对手太强了,直接放大吧"); }}
3.Context上下文角色
构造方法包含了策略类,根据传进来的具体策略释放不同的技能public class Context { private FightStratety mFightStratety; public Context(FightStratety fightStratety) { mFightStratety = fightStratety; } /** * 根据传进来的策略,释放不同的技能 * */ public void fighting(){ mFightStratety.fighting(); }}
4.客户端调用
大G与柯基互相探明对方实力,然后采用了不同的策略来释放技能。
public class Client { public static void main(String []args){ Context context; //大G先用爪子试探了一下柯基,柯基愤怒回应:喵~ context = new Context(new CommenStratety()); context.fighting(); //大G龇牙咧嘴,柯基觉得唬不住了,决定要把大G周围的空气吃光,把大G憋死 context = new Context(new FinalStratety()); context.fighting(); }}
一场嘴遁大战后,哈士奇大G落荒而逃,自此深知狗生无望…
优缺点对比
优点:
1.避免使用多重条件语句,因为不易维护,好出错 2.方便拓展,添加一个策略,只要实现接口即可 缺点: 1.每个策略都是一个类,复用性太小。 2.上层模块必须知道有哪些策略,才能够使用,违反了迪米特原则使用场景
1.对用户隐藏具体的实现策略、算法,完全独立
2.针对同一类型问题的多种处理方式,仅仅是具体行为有差别时 3.在一个类中定义了很多行为,且以多重条件语句出现发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2025年04月01日 08时43分15秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
移动互联网恶意软件命名及分类
2021-05-09
adb shell am 的用法
2021-05-09
PySide图形界面开发(一)
2021-05-09
Android如果有一个任意写入的漏洞,如何将写权限转成执行权限
2021-05-09
三角网格体积计算
2021-05-09
现代3D图形编程学习-基础简介(2) (译)
2021-05-09
Github教程(3)
2021-05-09
vue实现简单的点击切换颜色
2021-05-09
vue3 template refs dom的引用、组件的引用、获取子组件的值
2021-05-09
深入浅出mybatis
2021-05-09
Zookeeper快速开始
2021-05-09
882. Reachable Nodes In Subdivided Graph
2021-05-09
402. Remove K Digits
2021-05-09
375. Guess Number Higher or Lower II
2021-05-09
650. 2 Keys Keyboard
2021-05-09
764. Largest Plus Sign
2021-05-09
214. Shortest Palindrome
2021-05-09
916. Word Subsets
2021-05-09
869. Reordered Power of 2
2021-05-09
1086 Tree Traversals Again
2021-05-09