• 定义:定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。
package design.Strategy;/*** @Author: hyh* @Date: 2021/8/19 14:04* 抽象一个策略**/
public interface Strategy {// 执行void excute(int a, int b);
}// 加法
class Add implements Strategy {@Overridepublic void excute(int num1, int num2) {System.out.println("加法策略:" + (num1 + num2));}
}// 乘法
class Multiplication implements Strategy {@Overridepublic void excute(int num1, int num2) {System.out.println("乘法策略:" + num1 * num2);}
}// 计算器封装两个算法
class Calculator implements Strategy {private Strategy s;public Calculator(Strategy s) {this.s = s;}@Overridepublic void excute(int num1, int num2) {this.s.excute(num1,num2);}
}class Client {public static void main(String[] args) {// 使用加法策略Add add = new Add();// 通过Calculator calculator = new Calculator(add);calculator.excute(1,2);}
}
输出:
加法策略:3// 枚举策略  只需要一个枚举即可完成上述功能
enum Calculators {ADD() {@Overridepublic void execute(int num1, int num2) {System.out.println("加法策略:" + (num1 + num2));}},MUL() {@Overridepublic void execute(int num1, int num2) {System.out.println("加法策略:" + ( num1 * num2));}};public abstract void execute(int num1, int num2);
}class Client {public static void main(String[] args) {Calculators.ADD.execute(1, 2);}
}
输出:
加法策略:3

策略模式的优点

  • 算法可以自由切换

这是策略模式本身定义的,只要实现抽象策略,它就成为策略家族的一个成员,通过封 装角色对其进行封装,保证对外提供“可自由切换”的策略。

  • 避免使用多重条件判断

如果没有策略模式,我们想想看会是什么样子?一个策略家族有5个策略算法,一会要 使用A策略,一会要使用B策略,怎么设计呢?使用多重的条件语句?多重条件语句不易维 护,而且出错的概率大大增强。使用策略模式后,可以由其他模块决定采用何种策略,策略 家族对外提供的访问接口就是封装类,简化了操作,同时避免了条件语句判断。

  • 扩展性良好

这甚至都不用说是它的优点,因为它太明显了。在现有的系统中增加一个策略太容易 了,只要实现接口就可以了,其他都不用修改,类似于一个可反复拆卸的插件,这大大地符 合了OCP原则

策略模式的缺点

  • 策略类数量增多

每一个策略都是一个类,复用的可能性很小,类数量增多。

  • 所有的策略类都需要对外暴露

上层模块必须知道有哪些策略,然后才能决定使用哪一个策略,这与迪米特法则是相违 背的,我只是想使用了一个策略,我凭什么就要了解这个策略呢?那要你的封装类还有什么 意义?这是原装策略模式的一个缺点,幸运的是,我们可以使用其他模式来修正这个缺陷, 如工厂方法模式、代理模式或享元模式。

读设计模式之禅--策略模式相关推荐

  1. 设计模式之禅-策略模式

    1 策略模式有点类似状态模式,不过策略的调用链切换是固定的. A  A can not do -> B B can not do -> C do 2 代码 #include <ios ...

  2. 设计模式之禅——策略模式(Strategy Pattern)

    1.基本概念 在策略模式中,一个类的行为或算法可以在运行时更改.我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象.策略对象改变 context 对象的执行算法. 2. ...

  3. 读书 | 设计模式之禅 - 策略模式

    文章目录 1. 引入策略模式 2. 策略模式定义 3. 策略模式的优点 1. 引入策略模式 智谋无敌的诸葛亮,在刘备去东吴招亲之前,特授以伴郎赵云三个锦囊,说是按天机拆开解决棘手问题. 这三个妙计分别 ...

  4. 读设计模式之禅--模板方法模式

    定义:定义一个操作中的算法的框架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 /*** @auther hyh* 生产一个芭比娃娃机器人* @create ...

  5. 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...

  6. 设计模式入门(策略模式)

    [0]README 0.1)本文部分文字描述转自 "head first 设计模式",旨在学习 设计模式入门(策略模式) 的基础知识: 0.2)本文章节4和5的source cod ...

  7. 【设计模式七之策略模式】你有你的张良计,我有我的过墙梯

    Strategy模式 细说策略模式 策略模式究竟是什么模式 策略模式的场景 官宣的策略模式 代码展示 代码一 细说策略模式 提示: 博主:章飞 _906285288的博客 博客地址:http://bl ...

  8. 设计模式 之美 -- 策略模式

    策略模式作为行为型设计模式中的一种,主要封装相同功能的不同实现算法,用于在用户程序内部灵活切换.对用户来说能够快速替换对应的算法,能够让算法的实现独立于使用的用户. 基本的UML类图如下: 用户使用S ...

  9. Java设计模式之十一 ---- 策略模式和模板方法模式

    前言 在上一篇中我们学习了行为型模式的访问者模式(Visitor Pattern)和中介者模式(Mediator Pattern).本篇则来学习下行为型模式的两个模式,策略模式(Strategy Pa ...

最新文章

  1. Java计算两个字符串日期之间的天数差
  2. 探索式软件测试—Exploratory Software Testing
  3. python3super用法_Python3中的super()函数详解
  4. .NET 指南:实现 Equals 方法
  5. you must reset your password using alter table
  6. 别再只盯着国外!在集设发现了优秀设计师原创作品!
  7. iOS开发 - ARC的开启与关闭
  8. 【语言处理与Python】9.2处理特征结构\9.3扩展基于特征的文法
  9. 【.NET开发之美】使用ComponentOne提高.NET DataMap中的加载速度
  10. windows7打不开html文件格式,mht是什么文件?Win7打不开mht格式文件的解决办法
  11. 丹佛机场自动行包系统案例
  12. 程序员是一群什么样的人,1024程序员节调查报告」这群IT人有点东西哟
  13. 如何收集SparkSteaming运行日志实时进入kafka中
  14. 一个看漫画、看资讯、逛论坛、听歌的神器,务必吃下这颗安利!
  15. html图片旋转3种方式—— CSS3 transform
  16. 远程开机:一个简单的嵌入式项目开发
  17. Linux-C C语言编译过程
  18. [python] fileinput模块
  19. iOS中跑马灯效果小结
  20. 使用windows自带diskpart转换磁盘格式

热门文章

  1. linux网卡下有两个system,systemd-networkd 作为网络管理服务,导致dhcp给所有网卡分配同样的IP...
  2. 按下空格键,qt程序就结束了
  3. 近五年重大勒索软件攻击事件盘点
  4. dat图片 电脑端微信_电脑微信有没有把图片dat转为jpg的方法去哪找
  5. android11.0 Launcher3 高端定制之日历动态图标
  6. Lex/Yacc 初识Lex
  7. dau计算公式_数据分析体系 — 用户粘性的两个计算指标(DAU/MAU和月人均活跃天数)...
  8. 让JPG文件变大的方法
  9. 迪丽热巴终于剪对了刘海!这么选刘海你的发型还有的救
  10. 人工神经网络 经验公式_几种折弯方法展开计算公式