一、定义

定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。策略模式使这些算法在客户端调用它们的时候能够互不影响地变化。(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. JSONModel 简单例子

    // ProductModel.h // JSONModel // // Created by 张国锋 on 15/7/20. // Copyright (c) 2015年 张国锋. All righ ...

  2. JAVA分包下项目部分代码存储

    一.注册时姓名去重和符合汉字格式: // 新用户申请加入 public void NewHuman() { System.out.println("========新会员申请加入页面==== ...

  3. php设计模式-单例

    单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例. <设计模式>对此的定义:保证一个类仅有一个实例,并提供一个访 ...

  4. ABAP数据类型

    数据类型表: 类型缩写 类型 默认长度 允许长度 初始值 描述 C 文本型 1   Space 字符串数据,如'Program' D 日期型 8 8 '00000000' 日期数据,格式为YYYYMM ...

  5. mui实现图片更换(暂未上传)

    页面中有默认的图片,触发type为file的input时,更换图片,这个是mui移动端的项目,算了,不多说,开码 首先,先在html页面中设置样式,样式我就不给了,贴个布局 <div class ...

  6. 零基础逆向工程13_C语言07_指针01_反汇编

    1."带*类型"的特征探测 宽度 在同一个平台下,任何指针变量的尺寸都是一样的(都等于系统字长),如在32位平台中任何类型指针宽度都是32位. 声明 1.带有* 的变量类型的标准写 ...

  7. 宿主机Windows访问虚拟机Linux文件(一)

    如果用户使用windows操作系统,但是在虚拟机下配置Linux内核操作操作系统,往往需要实现通过宿主机Windows操作系统访问Linux内核操作系统中资源.本次实验实现的是宿主机windows 1 ...

  8. 第一篇Active Directory疑难解答概述(2)

    从故障诊断的角度来看,无论用户对象存在于哪个Active Directory域中,Exchange都需要访问此数据.这意味着所有包含启用Exchange的对象的域必须对其运行Setup / Prepa ...

  9. jacvaSe-LinkedList

    package com.java.chap08.sec02; import java.util.LinkedList; public class TestLinkedList { private st ...

  10. OSSIM安装与使用感受

    下载地址 http://www.alienvault.com OSSIM通过将开源产品进行集成,从而提供一种能够实现安全监控功能的基础平台.它的目标是提供一种集中式.有组织的,能够更好地进行监测和显示 ...