如何让孩子爱上设计模式 ——14.策略模式(Strategy Pattern)
来源:互联网 发布:如何从考勤机导出数据 编辑:程序博客网 时间:2024/05/02 14:55
如何让孩子爱上设计模式 ——14.策略模式(Strategy Pattern)
标签: 设计模式初涉
描述性文字
本节讲解的是行为型设计模式中的第一个模式: 策略模式,
这个模式非常简单,也很好理解。
定义一系列的算法,把每个算法封装起来,并使得他们可以相互替换,
让算法独立于使用它的客户而变化。
一般用来替换if-else,个人感觉是面向过程与面向对象思想的
过渡,这里举个简易计算器的栗子,帮助理解~
普通的if-else/switch计算器
普通的面向过程if-else简易计算器代码如下:
运行结果如下:
这里我们也可以改成switch,代码显得简洁一些,但也是换汤不换药
策略模式实现简易计算器
其实就是把if-else涉及到的算法,策略行为抽取出来,统一的接口,
然后各自实现,比如这里我们把抽取计算的接口,然后继承分别实现
加减乘除:
编写上下文对象,负责与具体的策略类交互
客户端调用:
输出结果:
好了,这就是最简单的策略模式的栗子了,面向对象的if-else到
面向过程的策略模式,算法可以独立于使用它的用户而变化,比如
这里我们加多一个求余也非常简单。
概念相关
定义
定义一系列算法,将每一个算法封装起来,并让它们可以相互替换;
策略模式让算法独立于使用它的客户而变化
三个角色
- Context: 上下文环境类,持有抽象策略角色的引用
- Strategy: 抽象策略类,定义一系列抽象的算法策略
- ConcreteStrategy: 具体策略类,实现具体的算法策略
UML类图
应用场景
- 1.一个系统需要动态地在几种算法中选择一种的情况
- 2.系统里面有许多类,它们之间的区别仅在于它们的行为,使用策略模式可以动态
地让一个对象在许多行为中选择一种行为 - 3.一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重条件
选择语句来实现。此时,使用策略模式,把这些行为转移到相应的具体策略类里面,
就可以避免使用难以维护的多重条件选择语句。 - 4.不希望客户端知道复杂的、与算法相关的数据结构,在具体策略类中封装算法
与相关的数据结构,可以提高算法的保密性与安全性。
优缺点
优点:
- 定义一系列算法实现,实现让这些算法可相互替换
- 避免多重条件语句
- 更好的扩展性
缺点:
- 调用者必须了解每种策略的不同,自行选择使用哪个策略
- 增加了对象数目,可使用享元模式在一定程度上减少对象数量
- 只适合扁平的算法结构,在一个策略接口下,运行时只有一个算法被使用,
这样就限制了算法的使用层级,使用时不能嵌套调用
本节代码:
https://github.com/coder-pig/DesignPatternsExample/tree/master/13.Strategy%20Pattern
1 1
- 如何让孩子爱上设计模式 ——14.策略模式(Strategy Pattern)
- 如何让孩子爱上设计模式 —— 2.单例模式(Singleton Pattern)
- 如何让孩子爱上设计模式 —— 3.建造者模式(Builder Pattern)
- 如何让孩子爱上设计模式 —— 4.原型模式(Prototype Pattern)
- 如何让孩子爱上设计模式 —— 5.工厂方法模式(Factory Method Pattern)
- 如何让孩子爱上设计模式 —— 6.抽象工厂模式(Abstract Factory Pattern)
- 如何让孩子爱上设计模式 —— 7.适配器模式(Adapter Pattern)
- 如何让孩子爱上设计模式 ——8.装饰者模式(Decorator Pattern)
- 如何让孩子爱上设计模式 ——9.组合模式(Composite Pattern)
- 如何让孩子爱上设计模式 ——10.桥接模式(Bridge Pattern)
- 如何让孩子爱上设计模式 ——11.外观模式(Facade Pattern)
- 如何让孩子爱上设计模式 ——12.享元模式(Flyweight Pattern)
- 如何让孩子爱上设计模式 ——13.代理模式(Proxy Pattern)
- 如何让孩子爱上设计模式 ——15.观察者模式(Observer Pattern)
- 如何让孩子爱上设计模式 ——16.迭代器模式(Iterator Pattern)
- 如何让孩子爱上设计模式 ——17.命令模式(Command Pattern)
- 如何让孩子爱上设计模式 ——18.备忘录模式(Memento Pattern)
- 如何让孩子爱上设计模式 ——19.中介者模式(Mediator Pattern)
- linux 内核编译——修改内核版本号
- 打开文本时候 rb与r的区别
- TCP之报头格式——连接建立与拆除
- java创建对象的方式
- 初学者对web.xml的理解
- 如何让孩子爱上设计模式 ——14.策略模式(Strategy Pattern)
- html2canvas截图的内容中存在跨域图片时出错解决思路
- 黑马程序员IOS第1期基础+就业班
- 如何做好一位资深的web前端工程师
- (转)servlet的url-pattern匹配规则
- bootstrap-分页
- 图像处理—CIF to QCIF记录
- 关于音视频封装的理解
- Java-图片处理 Gif转Jpg