Java设计模式之策略模式原理与用法实例详解
本文实例讲述了Java设计模式之策略模式原理与用法。分享给大家供大家参考,具体如下:
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。其中JDK里面的TreeSet类和TreeMap类就用到了策略模式。这两个类是带排序的集合类,其中排序的规则就相当于策略模式里定义的一系列算法,而集合类就相当于是策略模式里的环境类,供用户使用,用只知道TreeSet和TreeMap是带排序的,至于怎么排序的,是由排序的算法决定的。
策略模式由三部分组成:抽象策略角色,具体策略角色,环境角色。
抽象策略角色:策略类,通常由一个接口或者抽象类实现。
具体策略角色:实现了抽象策略类,并包装了相关的算法和行为。
环境角色:持有一个策略类的引用,最终给客户端调用。
下面提供一个简单的策略模式的代码实例:
1.抽象策略角色:定义一个接口Strategy。
package com.test; /** * 策略模式抽象角色 * @author zhouwen * */ public interface Strategy { public int calculate(int a, int b); }
2.具体策略角色:实现Strategy接口。例子中是实现加减乘除的运算。
package com.test; /** * 策略模式具体策略类 * 实现加法运算 * @author zhouwen * */ public class AddStrategy implements Strategy { @Override public int calculate(int a, int b) { return a + b; } }
package com.test; /** * 策略模式具体策略类 * 实现减法运算 * @author zhouwen * */ public class SubtractStrategy implements Strategy { @Override public int calculate(int a, int b) { return a - b; } }
package com.test; /** * 策略模式具体策略类 * 实现乘法运算 * @author zhouwen * */ public class MultiplyStragety implements Strategy { @Override public int calculate(int a, int b) { return a * b; } }
package com.test; /** * 策略模式具体策略类 * 实现除法运算 * @author zhouwen * */ public class DivideStrategy implements Strategy { @Override public int calculate(int a, int b) { return a / b; } }
3.环境角色:在环境角色中定义一个抽象角色的引用,并暴露出计算的方法,供客户端调用。
package com.test; /** * 策略模式环境类 * @author zhouwen * */ public class Environment { private Strategy strategy; public Environment(Strategy strategy){ this.strategy = strategy; } //用以改变策略 public void setStrategy(Strategy strategy){ this.strategy = strategy; } public Strategy getStrategy(){ return strategy; } //暴露计算的接口,供客户端调用 public int calculate(int a, int b){ return strategy.calculate(a, b); } }
4.最后编写客户端的代码:
package com.test; public class Client { public static void main(String[] args) { AddStrategy addStrategy = new AddStrategy(); Environment environment = new Environment(addStrategy); System.out.println(environment.calculate(3, 4)); SubtractStrategy subStrategy = new SubtractStrategy(); environment.setStrategy(subStrategy); System.out.println(environment.calculate(3, 4)); MultiplyStragety multiplyStrategy = new MultiplyStragety(); environment.setStrategy(multiplyStrategy); System.out.println(environment.calculate(3, 4)); DivideStrategy divideStrategy = new DivideStrategy(); environment.setStrategy(divideStrategy); System.out.println(environment.calculate(3, 4)); } }
总结:
由客户端的System.out.println(environment.calculate(3, 4));
这句代码,我们并不知道具体调用的是哪个实现类,只有知道了传给环境角色的具体策略类我们才知道调用哪个类,这样就能实现客户端和具体策略算法的分离,使程序易于切换、易于理解、易于扩展。
策略模式的优缺点:
优点:
1.策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得他们可以相互替换。如提供的例子中通过set方法对策略进行替换。
2.策略模式使得算法可以在不影响客户端的情况下发生变化。使用策略模式可以把行为和环境分隔开。
3.环境类负责维持和查询行为类,各类算法则在具体策略中提供。由于算法和环境独立开来,算法的修改不会影响环境和客户端。
缺点:
1.客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
2.会造成很多的策略类。
更多java相关内容感兴趣的读者可查看本站专题:《Java面向对象程序设计入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
- 事故记录-过多进程致使CPU卡死
- Flash/Flex学习笔记(54):迷你滚动条ScrollBar
- linux下正向代理/反向代理/透明代理使用说明
- 万达网科年底集体裁员?公司回应仅是业务调整
- 两个四字母域名均以五位数被交易
- Flash/Flex学习笔记(15):FMS 3.5之远程共享对象(Remote Shared Object)
- Android Fragment完全解析
- Centos下堡垒机Jumpserver V3.0环境部署完整记录(2)-配置篇
- Flash/Flex学习笔记(53):利用FMS快速创建一个文本聊天室
- 28家银行用户体验调研报告:洞见银行业的“进化论”
- 性能计数器数据收集服务
- SQL SERVER 内存分配及常见内存问题 DMV查询
- 6 利用Docker .NET应用程序模板制作您的容器应用程序(第2部分)
- Mesos+Zookeeper+Marathon的Docker管理平台部署记录(1)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- JavaScript 中 this 的错误认识、绑定规则、常见问题讲解
- 实践:SpringBoot实现定时任务的动态增删启停
- Java并发编程的艺术[3]
- R语言 | 根据数据框的顺序进行筛选
- 上帝视角看 TypeScript
- 一文 get 入门 canvas 的最佳路径
- Matlab系列之数组的基本操作
- Matlab系列之数组(矩阵)的生成
- R语言T检验的简单小例子
- ggplot2 修改图例的一些操作
- 实践:SpringBoot实现定时任务的动态增删启停
- Asp.Net Core API 需要认证时发生重定向的解决方法
- 在 Windows 系统上启用远程应用
- ArcGIS Enterprise 配置 nginx 反向代理
- 在安卓手机上通过 Termux 运行编译/运行 .NET 应用