Java策略模式(Strategy)
一、定义
定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。策略模式使这些算法在客户端调用它们的时候能够互不影响地变化。(Java的TreeSet集合中,构造方法可传入具体的比较器对象以实现不同的排序算法。就是利用的策略模式)策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中, 从而使得它们可以相互替换,使用策略模式可以把行为和环境分割开来。
二、意义
策略模式使开发人员能够开发出由许多可替换的部分组成的软件,并且各个部分之间是弱连接的关系。弱连接的特性使软件具有更强的可扩展性,易于维护;更重要的是,它大大提高了软件的可重用性。
三、角色
- 抽象策略角色:策略类,通常由一个接口或者抽象类实现。
- 具体策略角色:包装了相关的算法和行为。
- 环境角色:持有一个策略类的引用,最终给客户端调用的。
四、编写步骤
- 对策略对象定义一个公共接口。(抽象策略角色)
- 编写策略类,该类实现了上面的公共接口(具体策略角色)
- 在使用策略对象的类中保存一个对策略对象的引用。实现对策略对象的set和get方法(注入)或者使用构造方法完成赋值(环境角色)
五、代码演示
抽象策略角色
/**
* 抽象策略角色
* @author zhangkang
*
*/
public interface Strategy {
int calculate(int a, int b);
}
具体策略角色---加法
/**
* 具体策略角色---加法
* @author zhangkang
*
*/
public class AddStrategy implements Strategy {
public int calculate(int a, int b) {
return a + b;
}
}
具体策略角色---减法
/**
* 具体策略角色---减法
* @author zhangkang
*
*/
public class SubtractStrategy implements Strategy {
public int calculate(int a, int b) {
return a - b;
}
}
具体策略角色---乘法
/**
* 具体策略角色---乘法
* @author zhangkang
*
*/
public class MultiplyStrategy implements Strategy {
public int calculate(int a, int b) {
return a * b;
}
}
具体策略角色---除法
/**
* 具体策略角色---除法
* @author zhangkang
*
*/
public class DivideStrategy implements Strategy {
public int calculate(int a, int b) {
return a / b;
}
}
环境角色
/**
* 环境角色
* @author zhangkang
*
*/
public class Environment {
private Strategy strategy;
public Environment(Strategy strategy) {
this.strategy = strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public Strategy getStrategy() {
return strategy;
}
public int calculate(int a, int b) {
return strategy.calculate(a, b);
}
}
客户端测试
/**
* 客户端
* @author zhangkang
*
*/
public class Test {
public static void main(String[] args) {
int a = 6;
int b = 2;
Strategy strategy = new AddStrategy(); //创建加法策略对象
Environment e = new Environment(strategy);
System.out.println("加法:" + e.calculate(a, b));
e.setStrategy(new SubtractStrategy()); //创建减法策略对象
System.out.println("减法:" + e.calculate(a, b));
e.setStrategy(new MultiplyStrategy()); //创建乘法策略对象
System.out.println("乘法:" + e.calculate(a, b));
e.setStrategy(new DivideStrategy()); //创建除法策略对象
System.out.println("除法:" + e.calculate(a, b));
}
}
输出:
加法:8
减法:4
乘法:12
除法:3
六、缺点
1.客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
2.造成很多的策略类。
可以使用工厂方法模式进行解决。
Java策略模式(Strategy)的更多相关文章
- Java策略模式(Strategy模式) 之体验
<JAVA与模式>之策略模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述策略(Strategy)模式的: 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法 ...
- Java 策略模式(Strategy)
创建一个能够根据所传递的参数对象的不同而具有不同行为的方法 要执行的算法固定不变,封装到一个类(Context)中 策略就是传递进去的参数对象,它包含执行代码 策略接口 /** * 策略接口 */ p ...
- 策略模式-Strategy(Java实现)
策略模式-Strategy 在策略模式中,一个类(策略使用者)可以更改自己的执行策略. 比如以排序算法为例子, 多种排序算法都归属于排序算法, 但是实现的算法细节不同, 使用者可以很轻松地替换策略, ...
- Java 设计模式系列(十二)策略模式(Strategy)
Java 设计模式系列(十二)策略模式(Strategy) 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以 ...
- JAVA设计模式之策略模式 - Strategy
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 ...
- 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)
在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了“工厂模式”.“策略模式”.“状态模式”等.当然在重构时,有的地 ...
- 【转】设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成 ...
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...
- 设计模式 - 策略模式(Strategy Pattern) 具体解释
策略模式(Strategy Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权全 ...
随机推荐
- java 多线程死锁
死锁案例: package com.test; public class DealThread implements Runnable { public String username; public ...
- 两个页面实现mui轮播图与选项卡结合
index.html页面 <!DOCTYPE html><html><head> <meta charset="utf-8"> &l ...
- 织梦channel标签中currentstyle不生效
文件:/include/taglib/channel.lib.php line约133行:if( ($row['id']==$typeid || ($topid==$row['id'] &&a ...
- 如何在cmd查看文件内容的md5值
在cmd下进入 要查看的文件目录 默认目录是c,切换到其他盘符例如: C:\D: 就会切换到D盘 D:\ 然后输入命令 certutil -hashfile 文件名称.文件类型 MD5 如 cert ...
- Eclipse IDE配置PHP开发、调试环境
前言 使用java语言开发的朋友想必对Eclipse开发工具已经不陌生了,那么Eclipse作为java主流的开发工具,是否能够开发PHP项目呢?答案如你所想,肯定是可以的!以下就是该IDE下如何配置 ...
- 51nod 1693 水群
基准时间限制:0.4 秒 空间限制:524288 KB 分值: 160 难度:6级算法题 收藏 关注 总所周知,水群是一件很浪费时间的事,但是其实在水群这件事中,也可以找到一些有意思的东西. 比如 ...
- Update主循环的实现原理
从写一段程序,到写一个app,写一个游戏,到底其中有什么不同呢?一段程序的执行时间很短,一个应用的执行时间很长,仅此而已.游戏中存在一个帧的概念. 这个概念大家都知道,类比的话,它就是电影胶卷的格.一 ...
- uva806 Spatial Structures 空间结构 (黑白图像的四分树表示)
input 8 00000000 00000000 00001111 00001111 00011111 00111111 00111100 00111000 -8 9 14 17 22 23 44 ...
- Android(java)学习笔记135:SQLite数据库(表)的创建 以及 SQLite数据库的升级
一.数据库的创建 1.文件的创建 //引用,如果文件不存在是不会创建的 File file = new File("haha.txt"): //输出流写数据 ...
- Array - Container With Most Water
/** * 此为暴力解法 * Find two lines, which together with x-axis forms a container, such that the container ...