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加密,当时是采用靠传递一个 ...
随机推荐
- Eclipse配置反编译插件jadclipse
参考自:https://blog.csdn.net/moneyshi/article/details/79715891 Jad是一个Java的一个反编译工具,是用命令行执行,和通常JDK自带的java ...
- Leetcode6. Z 字形变换
> 简洁易懂讲清原理,讲不清你来打我~ 输入字符串,按下右上下右上排列后输出字符串,今天辰哥来教大家如何利用Github来搭建一个自己的个人博客平台. ...
- Linux上常用插件的一些命令
Linux上关于jdk tomcat MySQL dubbo等的一些启动,结束,查看状态的命名. 1.tomcat 运行tomcat cd bin/ 进入tomcat 的bin 文件夹,直接运行: . ...
- Java规范的三种注释方式:
1.单行注释 // //单行注释 2.多行注释 /* */ /* 多行 注释 */ 3.文档注释[java特有的] /** */ ◆注释内容可以被JDK提供的工具javadoc所解析,生成一套以网页文 ...
- js 跨域请求失败
注:错误返回:Failed to load http://xxxxxxxxxxx: No 'Access-Control-Allow-Origin' header is present on the ...
- Netty 源码分析系列(二)Netty 架构设计
前言 上一篇文章,我们对 Netty做了一个基本的概述,知道什么是Netty以及Netty的简单应用. Netty 源码分析系列(一)Netty 概述 本篇文章我们就来说说Netty的架构设计,解密高 ...
- 8.7考试总结(NOIP模拟)[Smooth·Six·Walker]
前言 踩了挺多以前没踩过的坑... T1 一开始是打了一个 60pts 的 DFS ,在与暴力拍了几组数据保证正确性之后, 突然想到 BFS 可能会更快一些,然后就又码了一个 BFS,又和 DFS 拍 ...
- Oracle数据泵导入的时候创建索引是否会使用并行?
一.疑问,Oracle数据泵导入的时候创建索引是否会使用并行? 某客户需要使用数据泵进行迁移,客户咨询导入的时间能不能加快一点. 那么如何加快导入的速度呢? 多加一些并行,那么创建索引内部的索引并行度 ...
- C++ //深拷贝与浅拷贝 //浅拷贝 : 简单的赋值拷贝操作 //深拷贝: 在堆区重新申请空间 进行拷贝操作
1 //深拷贝与浅拷贝 2 3 //浅拷贝 : 简单的赋值拷贝操作 4 //深拷贝: 在堆区重新申请空间 进行拷贝操作 5 6 7 #include <iostream> 8 using ...