前言

我想大家都加班写过“业务代码”,一大堆的if else,甚至if里面套if…代码不得已变得十分臃肿,对应的维护成本也有所增加。而策略模式,就是为了解决违反了开放封闭原则的这一问题。

定义

定义一系列算法,把每个算法都封装起来,并使之可以相互替换。策略模式可以使算法可以独立于用户,来独立的变化

结构图

角色拆解分析:
1.Context:上下文角色,用来操作策略的上下文环境,承上启下,屏蔽高层模块对算法、策略的直接访问
2.Stragety:抽象策略角色,策略、算法的抽象,通常为接口
3.ConcreteStragety:具体的策略实现

举栗实现

这里就用哈士奇大G举栗吧,毕竟二哈是一个神奇的物种,狗怂话多,上帝向人间洒下了智慧,唯独二哈却撑起了伞。还有狂风桑配音的那两只吵架的柯基(劳资把你周围的空气吃光,把你给憋死!),一场嘴遁大战即将开战!没有人一上来就放大的,否则会被喷死的。要想取胜,就得制定应敌策略。

1.Stragety策略接口

策略接口定义了一个放技能的方法

public interface FightStratety {public void fighting();//放技能的方法
}

2.ConcreteStragety具体的策略实现

这里制定了2个级别的策略,分别是普通策略和终极策略,用来对付不同水准的对手。

/*** 普通策略,大G先用爪子试探下对手水平*/public class CommenStratety implements FightStratety {@Overridepublic void fighting() {System.out.print("对手太水没必要放大招,一边走位一边A就好");}
}
/*** 终极策略,柯基要把大G周围的空气吃光,想把大G憋死*/public class FinalStratety implements FightStratety {@Overridepublic 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.在一个类中定义了很多行为,且以多重条件语句出现

设计模式之策略模式学习笔记相关推荐

  1. 设计模式之策略模式学习

    摘  要   策略模式(Strategy):它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. --<HeadFirst设计模式> 一般 ...

  2. 设计模式之建造者模式学习笔记

    前言 建造者模式也叫生成器模式,是创建一个复杂对象的创建型模式,将此创建过程和部件解耦,使其构建过程和部件的表示分离开. 解释 建造者模式,说白了就是"攒机".比方说我想要定制一台 ...

  3. 设计模式之外观模式学习笔记

    简介 外观模式,也叫门面模式.隐藏了系统内部的复杂,向客户端提供了一个接口可以访问. 定义 一个子系统的外部和内部通信,必须通过一个统一的对象.该模式提供一个高层接口,使子系统更易使用. 结构图 角色 ...

  4. 设计模式之代理模式学习笔记

    前言 代理模式,也叫做委托模式.就好比请律师打官司一样,为其他对象提供一种代理,来控制对这个对象的访问. 结构图 接下来我们对以上结构图拆解,进行角色分析: 1.Subject:抽象主题类,声明真实主 ...

  5. 23种设计模式之工厂模式学习笔记

    什么是工厂模式? 工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式.该模式用于封装和管理对象的创建,是一种创 ...

  6. 设计模式之模板模式学习笔记

    前言 相信大家都写过各种各样的文档,需求文档.设计文档.使用手册等等.为了提高复用性和灵活度,需要采用一系列的模板来应对. 定义 定义一个操作中的算法框架,将一些步骤延迟到子类中,使子类不改变一个算法 ...

  7. Spring源码学习笔记:经典设计模式之策略模式

    1.博客内容均出自于咕泡学院架构师第三期 2.架构师系列内容:架构师学习笔记(持续更新) 0.策略模式(Strategy pattern) 指定义了算法家族,分别封装起来,让它们之间可以互相替换,此模 ...

  8. JavaScript设计模式之策略模式(学习笔记)

    在网上搜索"为什么MVC不是一种设计模式呢?"其中有解答:MVC其实是三个经典设计模式的演变:观察者模式(Observer).策略模式(Strategy).组合模式(Composi ...

  9. 换个姿势学设计模式:策略模式

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源:公众号「闻人的技术博客」 前言 前段时间,接到一个 ...

最新文章

  1. 沙盘正在注销进程start_进程,线程,多线程
  2. 如何简单学会ajax,学会自己封装简单AJAX
  3. Python 中的 if __name__ == __main__ 该如何理解
  4. 【杂谈】提升写代码效率不得不做的三件事
  5. go的错误处理(异常捕获、处理):defer+recover机制处理错误、自定义异常(自定义错误)
  6. 如何解决90%的NLP问题:逐步指导
  7. HTML5移动端音乐播放器(启蒙篇)
  8. 用户体验五要素_Kwai竞品分析用户体验五要素
  9. (数据库系统概论|王珊)第四章数据库安全性-第二、三、四、五、六节:数据库安全性控制
  10. python 代码片段23
  11. sizeof和strlen的简单使用方法和区别
  12. 黑苹果卡在苹果logo_黑苹果的历史
  13. matlab2010a编译器,MATLAB 2010a 添加 VS2010 编译器
  14. SA方法分析-图书管理系统
  15. 苹果微信换行怎么打_我用了两年的苹果手机,居然才知道,微信信息换行还能这样操作...
  16. windows2003 升级sp1,sp2 产品密匙无效
  17. 微信小程序体验评分问题
  18. 离散数学——范式(一)定义与求解
  19. 负载均衡技术应用介绍
  20. 数据采集—数据采集技术

热门文章

  1. arm云教室服务器_成都凌点科技告诉你ARM集群服务器适合的应用场景有哪些
  2. rocketmq源码解析之name启动(一)
  3. Java学习笔记--StringTokenizer的使用
  4. 把json对象串转换成map对象
  5. 转:在windows通过Xrdp软件远程桌面连接Fedora
  6. 5 关于数据仓库维度数据处理的方法探究系列——缓慢变化维处理——全历史记录...
  7. 小蠢笔记:从继承特性来看构造函数
  8. 10.25 es问题
  9. Android笔记三十三.BroadcastReceiver使用
  10. Struts2和SpringMVC的执行流程。