JAVA中的策略模式strategy
原文出自:http://ttitfly.iteye.com/blog/136467
1. 以一个算术运算为例,传统做法为:
package org.common;
public class Calculate {
public String getResult(float a,float b,char c){
float add = a+b;
float sub = a-b;
float mult = a*b;
float division = a/b;
switch(c){
case '+':
return "相加结果为:" + add;
case '-':
return "相减结果为:" + sub;
case '*':
return "相乘结果为:" + mult;
case '/':
return "相除结果为:" + division;
default:
return "出错";
}
}
}
package org.common;
public class Test {
public static void main(String[] args){
float a = 200;
float b = 50;
Calculate cal = new Calculate();
System.out.println(cal.getResult(a, b, '+'));
System.out.println(cal.getResult(a, b, '-'));
System.out.println(cal.getResult(a, b, '*'));
System.out.println(cal.getResult(a, b, '/'));
System.out.println(cal.getResult(a, b, '('));
}
}
运行结果为:
相加结果为:250.0
相减结果为:150.0
相乘结果为:10000.0
相除结果为:4.0
出错
2. 用策略模式来实现:
策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。
策略模式使得算法可以在不影响到客户端的情况下发生变化。使用策略模式可以把行为和环境分割开来。
环境类负责维持和查询行为类,各种算法则在具体策略中提供。由于算法和环境独立开来,算法的修改都不会影响环境和客户端
策略模式:
由三部分组成
A: 抽象策略角色:策略类,通常由一个接口或者抽象类实现
B: 具体策略角色:包装了相关的算法和行为
C: 环境角色:持有一个策略类的引用,最终给客户端调用的。
一个抽象策略角色:
package org.strategy;
/**
* 抽象策略角色
*/
public abstract class AbstractStrategy { public abstract String calculate(float a,float b);
}
几个具体策略角色:
package org.strategy;
/**
* 具体策略角色
*/
public class SubStrategy extends AbstractStrategy{ public String calculate(float a,float b){
float result = a-b;
return "相减结果为:" + result;
}
}
package org.strategy;
/**
* 具体策略角色
*/
public class AddStrategy extends AbstractStrategy{ public String calculate(float a,float b){
float result = a+b;
return "相加结果为:" + result;
}
}
package org.strategy;
/**
* 具体策略角色
*/
public class MultStrategy extends AbstractStrategy{ public String calculate(float a,float b){
float result = a*b;
return "相乘结果为:" + result;
}
}
package org.strategy;
/**
* 具体策略角色
*/
public class DivisionStrategy extends AbstractStrategy{ public String calculate(float a,float b){
float result = a/b;
return "相除结果为:" + result;
}
}
环境角色:
package org.strategy;
/**
* 环境角色,最终给客户端调用的
*/
public class ContextRole { /**
* 拥有一个策略类的引用
*/
private AbstractStrategy abstactStrategy; public ContextRole(AbstractStrategy abstactStrategy){
this.abstactStrategy = abstactStrategy;
} public String calculate(float a,float b) {
String result = abstactStrategy.calculate(a, b);
return result;
}
}
客户端调用:
package org.strategy;
/**
* 客户端
*/
public class Test { public static void main(String[] args){
float a = 200;
float b = 25; ContextRole contextRole1 = new ContextRole(new AddStrategy());
System.out.println(contextRole1.calculate(a, b)); ContextRole contextRole2 = new ContextRole(new SubStrategy());
System.out.println(contextRole2.calculate(a, b)); ContextRole contextRole3 = new ContextRole(new MultStrategy());
System.out.println(contextRole3.calculate(a, b)); ContextRole contextRole4 = new ContextRole(new DivisionStrategy());
System.out.println(contextRole4.calculate(a, b)); } }
输出结果为:
相加结果为:225.0
相减结果为:175.0
相乘结果为:5000.0
相除结果为:8.0
总结:
策略模式优点:
1.可以很方便的动态改变算法或行为
2.避免使用多重条件转移语句
策略模式缺点:
1.客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
2.造成很多的策略类。
JAVA中的策略模式strategy的更多相关文章
- 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)
在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了“工厂模式”.“策略模式”.“状态模式”等.当然在重构时,有的地 ...
- JAVA设计模式之策略模式 - Strategy
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 ...
- Java中的策略模式,完成一个简单地购物车,两种付款策略实例教程
策略模式是一种行为模式.用于某一个具体的项目有多个可供选择的算法策略,客户端在其运行时根据不同需求决定使用某一具体算法策略. 策略模式也被称作政策模式.实现过程为,首先定义不同的算法策略,然后客户端把 ...
- JAVA中的策略模式
现在我们有一个虚基类-鸭子(abstract Duck). 有真鸭子,野鸭子,橡皮鸭子继承了该类.虚基类有swing方法,毕竟游泳是所有的鸭子都应有的功能.还有一个虚方法display,这个方法在子类 ...
- java中的策略设计模式
本文主要讲java中的策略模式:一个可以根据不同的传入参数而具有不同行为的方法,就叫策略模式.概念可能有点不好理解,具体看下面代码: import java.util.Arrays; /** * 策略 ...
- java设计模式 策略模式Strategy
本章讲述java设计模式中,策略模式相关的知识点. 1.策略模式定义 策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户.策略模式属于对象的 ...
- 策略模式-Strategy(Java实现)
策略模式-Strategy 在策略模式中,一个类(策略使用者)可以更改自己的执行策略. 比如以排序算法为例子, 多种排序算法都归属于排序算法, 但是实现的算法细节不同, 使用者可以很轻松地替换策略, ...
- Java 设计模式系列(十二)策略模式(Strategy)
Java 设计模式系列(十二)策略模式(Strategy) 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以 ...
- Java设计模式之策略模式(Strategy)
前言: 最近一直在学习基于okHttp网络请求,学习的过程中就想起了之前项目中有这么一个需求不同的接口要采用不同的加密方式,比如登录之前要采用RSA加密,登录之后要采用AES加密,当时是采用靠传递一个 ...
随机推荐
- 初探SpringRetry机制
重试是在网络通讯中非常重要的概念,尤其是在微服务体系内重试显得格外重要.常见的场景是当遇到网络抖动造成的请求失败时,可以按照业务的补偿需求来制定重试策略.Spring框架提供了SpringRetry能 ...
- selenium3 + python - js&jquery操作处理
# 推荐学习:https://www.w3school.com.cn/js/index.asp## 下面以简书登录&注册定位元素为例"""js定位 id name ...
- 每天五分钟Go - 条件语句
if语句 if 布尔表达式 { /* 在布尔表达式为 true 时执行 */ } else { /* 在布尔表达式为 false 时执行 */ } 如下代码 if a>10{ fmt.Print ...
- Blazor 组件之间使用 EventCallback 进行通信
翻译自 Waqas Anwar 2021年3月28日的文章 <Communication between Blazor Components using EventCallback> [1 ...
- msf反弹
转载https://www.cnblogs.com/xishaonian/p/7721584.html msf 生成反弹 Windows Shell msfvenom -p windows/meter ...
- ASP.NET Core下FreeSql的仓储事务
ASP.NET Core下FreeSql的仓储事务 第一步:配置 Startup.cs 注入 引入包 dotnet add package FreeSql dotnet add package Fre ...
- git 提代码时的相关命令,Mark一下
以前用命令提代码都是复制粘贴,现在换了工作后,特别是回退代码的命令又忘了,去网上查了好久,心累.特此Mark一下 1. 打patch: 1.1 git diff >> ljh.patch ...
- 手脱UPX壳的方法
0X00 了解 upx UPX作为一款元老级PE加密壳,在以前的那个年代盛行,著名病毒[熊猫烧香]就是使用这款加密壳. 0X01 单步跟踪法 就是使用ollydbg加载程序后,按F8进行单 ...
- C++ //拷贝构造函数调用时机//1.使用一个已经创建完毕的对象来初始化一个新对象 //2.值传递的方式给函数参数传值 //3.值方式返回局部对象
1 //拷贝构造函数调用时机 2 3 4 #include <iostream> 5 using namespace std; 6 7 //1.使用一个已经创建完毕的对象来初始化一个新对象 ...
- 又一开源项目爆火于GitHub,Android高级插件化强化实战
一.插件化起源 插件化技术最初源于免安装运行 Apk的想法,这个免安装的 Apk 就可以理解为插件,而支持插件的 app 我们一般叫 宿主. 想必大家都知道,在 Android 系统中,应用是以 Ap ...