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加密,当时是采用靠传递一个 ...
随机推荐
- spring pom文件报错:提示no declaration can be found for element 'dubbo:service'.
转自:http://blog.csdn.net/happylife_haha/article/details/52755425 pom文件报错:The matching wildcard is str ...
- C++ Primer Plus 第四章 复合类型 学习笔记
第四章 复合类型 1. 数组概述 1.1 数组的定义 数组(array)是一种数据格式,能够存储多个同类型的值.每个值都存储在一个独立的数组元素中,计算机在内存中依次存储数组的各个元素. 数组声明的三 ...
- 什么是TCP?什么是TCP协议?
一.什么是TCP >>>TCP是一种传输控制协议,是面向连接的.可靠的.基于字节流之间的传输层通信协议 >>>在因特网协议族里面,TCP层是在IP层上面,应用层下面 ...
- UnitTest + HTMLTestRunner
#导入HTMLTestRunner类 from unitTest.tools1.HTMLTestRunner import HTMLTestRunner import unittest discove ...
- Vulnhub -- Jarbas靶机渗透
目标:拿到服务器的Shell 信息收集 配置好后用nmap扫描 kali's ip:192.168.241.131 nmap -sP 192.168.241.131/24 一个个扫描 发现192.16 ...
- 第九篇 -- 对数据库mysql进行连接并压测(二)
上一节介绍了对mysql查询语句的压测,这一节来进一步的了解. 还是先把数据库的图放上来. 接下来打开Jmeter. 1. 回顾一下上一节学的查询语句 JDBC Request配置 结果 2. 条件查 ...
- 搭建MySQL主从实现Django读写分离
一.MySQL主从搭建 主从配置原理: 主库写日志到 BinLog 从库开个 IO 线程读取主库的 BinLog 日志,并写入 RelayLog 再开一个 SQL 线程,读 RelayLog 日志,回 ...
- 理清 UT、UTC、GMT和CST
平时各种时间标准简写绕得不明不白,查一下整理在这里. IAT: International Atomic Time, 原子时.又称国际原子时,是一种通过原子钟得到的时间标准,原子钟是世界上已知最准确的 ...
- webSocket实现多人聊天功能
webSocket实现多人在线聊天 主要思路如下: 1.使用vue构建简单的聊天室界面 2.基于nodeJs 的webSocket开启一个socket后台服务,前端使用H5的webSocket来创建一 ...
- Verilog定点数计算
https://blog.csdn.net/maxwell2ic/article/details/80620991 https://blog.csdn.net/mdpsdhr/article/deta ...