设计模式之策略模式
时间:2019-06-17
本文章向大家介绍设计模式之策略模式,主要包括设计模式之策略模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
2019-06-17 11:39:49
策略模式(Strategy)
什么是设计模式:定义了一系列的算法(多种实现子类),并将每一个算法封装(通过父类策略应用访问具体子类的算法)起来,使每个算法可以相互替代,使算法本身和使用算法的客户端分割开来,相互独立。(客户端和具体算法均依赖抽象的策略)
优点:符合设计模式中的开闭原则(在不修改既有代码的基础上扩展功能)。
适用性:一个需求有多种不同算法的场合。(不固定的 if-else 场合一般是策略模式的用武之地)
基本代码如下:
1 //接口或抽象类,策略接口 2 public interface Strategy{ 3 //定义抽象的算法方法 4 public void algorithMethod(); 5 }
1 //具体的策略1实现 2 public class ConcreteStrategy1 implements Strategy{ 3 public void algorithmMethod(){ 4 //........具体策略1的方法体 5 } 6 }
//具体的策略2实现 public class ConcreteStrategy2 implements Strategy{ public void algorithmMethod(){ //........具体策略2的方法体 } }
1 public class StrategyContext{ 2 private Strategy strategy; //持有策略的引用 3 public StrategyContext( Strategy strategy){
4 this.strategy = strategy; 5 } 6 7 public void contextMethod(){ 8 otherMethod(); 9 strategy.algorithMethod(); 10 otherMethod(); 11 } 12 }
1 //外部客户端 2 public class Client{ 3 public static void main(String[] args) { 4 //具体测策略实现 5 IStrategy strategy = new ConcreteStrategy2(); //父类引用指向子类 6 //将具体的策略实现对象注入到策略上下文当中 7 StrategyContext ctx = new StrategyContext(strategy); 8 //调用上下文对象的方法来完成对具体策略实现的回调 9 ctx.contextMethod(); //调用时,会找到具体的策略 10 } 11 }
总结:
1 策略上下文依赖抽象策略,具体策略依赖抽象策略。(依赖抽象)
2 如需要扩展策略功能,在现有的基础上再设计一个策略的实现类,而不需要修改原有的代码。(开闭原则)
3 父类应用指向子类。(多态)
原文地址:https://www.cnblogs.com/youzoulalala/p/11039111.html
- Github 项目推荐 | 用 Pytorch 实现的 WaveNet-Vocoder
- 重启数据库的一场闹剧(r5笔记第68天)
- 【C语言系列】基础语法案例分析(初级篇)
- 一次ORA-00600问题的排查和分析(r5笔记第64、65天)
- SpringMVC入门就这么简单
- pl/sql中的forall简单测试(r5笔记第63天)
- SpringMVC【开发Controller】详解
- 巧用外部表备份历史数据(r5笔记第62天)
- Github 项目推荐 | 最小化类 AlphaGo Zero 引擎 —— Nochi
- 半自动化运维之快速连接到指定环境(一) (r5笔记第61天)
- Spring【DAO模块】知识要点
- 浅谈exp/imp(上) (r5笔记第81天)
- Java高并发秒杀系统【观后总结】
- 【专业技术】引擎算法探究
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- JavaScript中的compose函数和pipe函数
- 常用JS函数-数组扁平化,缓存函数,柯里化函数,防抖和节流函数
- JavaScript单元测试及原理
- 前端进阶知识汇总
- 前端也能学算法:由浅入深讲解动态规划
- 轻松理解JS中的面向对象,顺便搞懂prototype和__proto__
- 前端也能学算法:由浅入深讲解贪心算法
- web.py指南性说明
- this到底指向啥?看完这篇就知道了!
- 学以致用:手把手教你撸一个工具库并打包发布,顺便解决JS小数计算不准问题
- python 实现 php 的 var_dump 功能
- RSA初探,聊聊怎么破解HTTPS
- 深入解析Underscore.js源码架构
- python正向连接后门
- setTimeout和setImmediate到底谁先执行,本文让你彻底理解Event Loop