一、定义

定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。策略模式使这些算法在客户端调用它们的时候能够互不影响地变化。(Java的TreeSet集合中,构造方法可传入具体的比较器对象以实现不同的排序算法。就是利用的策略模式)策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中, 从而使得它们可以相互替换,使用策略模式可以把行为和环境分割开来。

二、意义

策略模式使开发人员能够开发出由许多可替换的部分组成的软件,并且各个部分之间是弱连接的关系。弱连接的特性使软件具有更强的可扩展性,易于维护;更重要的是,它大大提高了软件的可重用性。

三、角色

  • 抽象策略角色:策略类,通常由一个接口或者抽象类实现。
  • 具体策略角色:包装了相关的算法和行为。
  • 环境角色:持有一个策略类的引用,最终给客户端调用的。

四、编写步骤

  1. 对策略对象定义一个公共接口。(抽象策略角色)
  2. 编写策略类,该类实现了上面的公共接口(具体策略角色)
  3. 在使用策略对象的类中保存一个对策略对象的引用。实现对策略对象的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)的更多相关文章

  1. Java策略模式(Strategy模式) 之体验

    <JAVA与模式>之策略模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述策略(Strategy)模式的: 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法 ...

  2. Java 策略模式(Strategy)

    创建一个能够根据所传递的参数对象的不同而具有不同行为的方法 要执行的算法固定不变,封装到一个类(Context)中 策略就是传递进去的参数对象,它包含执行代码 策略接口 /** * 策略接口 */ p ...

  3. 策略模式-Strategy(Java实现)

    策略模式-Strategy 在策略模式中,一个类(策略使用者)可以更改自己的执行策略. 比如以排序算法为例子, 多种排序算法都归属于排序算法, 但是实现的算法细节不同, 使用者可以很轻松地替换策略, ...

  4. Java 设计模式系列(十二)策略模式(Strategy)

    Java 设计模式系列(十二)策略模式(Strategy) 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以 ...

  5. JAVA设计模式之策略模式 - Strategy

    在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 ...

  6. 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)

    在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了“工厂模式”.“策略模式”.“状态模式”等.当然在重构时,有的地 ...

  7. 【转】设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成 ...

  8. 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...

  9. 设计模式 - 策略模式(Strategy Pattern) 具体解释

    策略模式(Strategy Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权全 ...

随机推荐

  1. clickhouse源码Redhat系列机单机版安装踩坑笔记

    前情概要 由于工作需要用到clickhouse, 这里暂不介绍概念,应用场景,谷歌,百度一大把. 将安装过程踩下的坑记录下来备用 ClickHouse源码 git clone安装(直接下载源码包安装失 ...

  2. 实例——省市区三级联动 & 还可以输入字符统计

    1 省市区三级联动 html代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...

  3. python中的getcwd

    Help on built-in function getcwd in module posix: getcwd(...)    getcwd() -> path        Return a ...

  4. mysql-新增、更新、删除语句

    1.插入数据: INSERT INTO t_book VALUES(NULL,'我爱我家',20,'张三',1); INSERT INTO t_book(id,bookName,price,autho ...

  5. 用NPOI操作EXCEL-锁定列CreateFreezePane()

    public void ExportPermissionRoleData(string search, int roleStatus) { var workbook = new HSSFWorkboo ...

  6. MyEclipse7.0 M1下载和注册码

    首先介绍下,这款MyEclipse7.0 M1已经内置了Eclipse3.4,所以无需再去下载. 1.下载地址: http://downloads.myeclipseide.com/downloads ...

  7. codeforces Gym 100286H Hell on the Markets

    紫书上面的题,队友做的,WA了freopen..爆了int... UVA 1614 - Hell on the Markets 奇怪的股市(贪心,结论)

  8. UVA 1153 Keep the Customer Satisfied 顾客是上帝(贪心)

    因为每增加一个订单,时间是会增加的,所以先按截止时间d排序, 这样的话无论是删除一个订单,或者增加订单,都不会影响已经选好的订单. 然后维护一个已经选好的订单的大根堆(优先队列),如果当前无法选择的话 ...

  9. Android(java)学习笔记118:BroadcastReceiver之 外拨电话的广播接收者

    1. 外拨电话的广播接收者: 首先我们示例工程一览表如下: (2)首先我们还是买一个收音机,定义一个OutCallReceiver继承自BroadcastReceiver,onReceive()方法中 ...

  10. [机器视觉] SIFT特征-尺度不变特征理解

    SIFT特征-尺度不变特征理解 简介 SIFT,即尺度不变特征变换(Scale-invariant feature transform,SIFT),是用于图像处理领域的一种描述.这种描述具有尺度不变性 ...