Strategy策略模式详解与实例
继续java的视频学习,博客还是不能丢,要坚持!Strategy策略模式是23个设计模式之一,是我们常用的模式之一。
Strategy策略模式:
体现了两个非常基本的面向对象设计原则:
---封装变化概念
---编程中受用接口,而不是对接口的实现
1.定义:
定义一组算法,讲每个算法都封装起来,使它们之间可以互换;
使在客户端调用它们的时候能够互不影响的变化。
2.组成:
抽象策略角色:策略类,通常有一个接口或者抽象类实现;
具体策略角色:包括了相关算法的行为;
环境角色:持有一个策略类的引用,最终给客户端调用。
3.实现:
针对一组算法,将每一个算法封装到具有接口的独立类中,从而使他们可以互相替换;可以在不影响客户端的情况下发生变化,可以把行为和环境分开。环境类负责维持和查询行为类各种算法则在具体策略中提供。由于算法和环境独立开来,算法的修改都不会影响客户端。
4.编写步骤:
1)对策略对象定义一个公共接口;
2)编写策略类,该类实现了上面的公共接口,
3)在使用策略对象的类中保存一个策略对象的引用,
4)在策略对象的类中,实现策略对象的set和get方法,
5)使用构造方法完成赋值;
5.缺点:
客户端必须知道所有的策略类,并自行决定使用哪一个策略类;造成很多策略类,维护代价很高;
解决方法:工厂方法(factory method)。
6.实例:
package StrategyTest;//Strategy接口
public interface Strategy { //1)对策略对象定义一个公共接口public int calculate(int a,int b);//定义一个计算器的方法,接受两个整形参数}//2)编写策略类,该类实现了上面的公共接口,
package StrategyTest;//加运算
public class AddStretegy implements Strategy{//重写接口的calculate方法,返回a+b
public int calculate(int a, int b) {return a+b;
}}package StrategyTest;//减运算
public class SubtractStrategy implements Strategy {//重写接口的calculate方法,返回a-b
public int calculate(int a, int b) {return a-b;
}}package StrategyTest;//除运算
public class SubtractStrategy implements Strategy {//重写接口的calculate方法,返回a/b
public int calculate(int a, int b) {return a-b;
}}package StrategyTest;//乘运算
public class DivideStrategy implements Strategy {//重写接口的calculate方法,返回a*b
public int calculate(int a, int b) {return a/b;
}
}package StrategyTest;
//3)在使用策略对象的类中保存一个策略对象的引用,public class Environment {private Strategy strategy;//4)在策略对象的类中,实现策略对象的set和get方法,public void setStrategy(Strategy strategy){this.strategy = strategy;
}public Strategy getStrategy(){return this.strategy ;
}
public int calculate(int a,int b){return strategy.calculate(a, b);
}
}package StrategyTest;public class Client {public static void main(String[] args) {
//5)使用构造方法完成赋值;AddStretegy add= new AddStretegy();Environment en = new Environment(add); System.out.println(en.calculate(3, 4));SubtractStrategy sub = new SubtractStrategy();en.setStrategy(sub);System.out.println(en.calculate(5, 1));MultiplyStrategy mul = new MultiplyStrategy();en.setStrategy(mul);System.out.println(en.calculate(3, 4));DivideStrategy div = new DivideStrategy();en.setStrategy(div);System.out.println(en.calculate(3, 1));}}
运行结果:
参考:
张龙老师圣思园java教程。
Strategy策略模式详解与实例相关推荐
- 从java多态到策略模式_设计模式中的多态——策略模式详解
2. 策略模式详解 2.1 策略模式定义 策略模式定义了一系列算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户端而独立的变化. 可以使用多态进行类比来理解策略模 ...
- 设计模式之策略模式详解
设计模式之策略模式详解 概述 先看下面的图片,我们去旅游选择出行模式有很多种,可以骑自行车.可以坐汽车.可以坐火车.可以坐飞机. 作为一个程序猿,开发需要选择一款开发工具,当然可以进行代码开发的工具有 ...
- java策略模式_Java设计模式之策略模式详解
本文实例为大家分享了Java策略模式,供大家参考,具体内容如下 1.策略模式(Strategy Pattern)是一种比较简单的模式,也叫做政策模式(PolicyPattern). 定义如下: Def ...
- 设计模式——策略模式详解
0. 前言 写在最前面,本人的设计模式类博文,建议先看博文前半部分的理论介绍,再看后半部分的实例分析,最后再返回来复习一遍理论介绍,这时候你就会发现我在重点处标红的用心,对于帮助你理解设计模式有奇效哦 ...
- java策略模式详解_Java经典设计模式之策略模式原理与用法详解
本文实例讲述了Java经典设计模式之策略模式.分享给大家供大家参考,具体如下: 策略模式指:策略模式指将程序中可变部分抽象分离成一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式 ...
- 学习笔记(20):第2章 架构师内功心法之设计模式 -策略模式详解
立即学习:https://edu.csdn.net/course/play/28941/403582?utm_source=blogtoedu 策略模式:提供多种算法,由使用者来选择使用哪种方式来实现 ...
- java builder pattern_Java Builder Pattern建造者模式详解及实例
Java Builder Pattern 1.概念 将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. [构建与表示分离,同构建不同表示] 与抽象工厂的区别:在建造者模式里,有个指 ...
- 策略模式详解(英雄联盟上王者案例)
"且听说书人把对和错变成利与弊,把铜板藏入衣袖笑着说道德里哪有枪和毙"
- 组合模式详解附有代码案例分析(包含透明组合模式、安全组合模式的代码示例)
组合模式 一.组合模式的概念和角色 (一).组合模式的概念 (二).组合模式的角色 二.组合模式的应用场景 三.透明组合模式的代码示例 四.安全组合模式的代码示例 五.组合模式的优缺点 (一).优点 ...
- 模板方法模式详解附有代码案例分析(包含模板方法模式重构JDBC操作业务代码示例)
模板方法模式 一.模板方法模式的概念和角色 (一).模板方法模式的概念 (二).模板方法模式的角色 二.模板方法模式的应用场景 三. 模板方法模式的代码示例 四.模板方法模式重构JDBC操作业务 五. ...
最新文章
- 深蓝学院的深度学习理论与实践课程:第四章
- python爬虫获取的网页数据为什么要加[0-使用 Python 爬取网页数据
- NFVI融合架构解决方案的四大特点—Vecloud微云
- html语言中项目列表的嵌套,做HTML嵌套列表的正确方法?
- 获取iOS任意线程调用堆栈(五)完整实现:BSBacktraceLogger
- java 静态块初始化_简单了解java中静态初始化块的执行顺序
- oracle索引sys_nc,通过dba_ind_columns表查到索引所在列的名字为SYS_NC00133$
- Centos7下python3安装ipython
- 转:gcc编译C++程序
- 基于LDAP的WebLogic虚拟化统一用户权限管理
- CF - 1214D
- 数据转换transform练习
- pert计算公式期望值_PERT方法:用于计算各工序和工时的方法
- Delphi外挂制作
- Win8操作系统下IIS如何配置asp.net的运行环境
- 期权套利组合 matlab,期权交易:简单套利组合
- 京东跨端组件库 NutUI 2.0 来袭
- 高等数学(第七版)同济大学 习题7-4 个人解答
- 【高等数学】第二章 导数与微分——第一节 导数的概念
- AD9361配置(1)