原文出自:http://ttitfly.iteye.com/blog/136467

1. 以一个算术运算为例,传统做法为:

java 代码
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 "出错";
}
} }

  

java 代码:
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:  环境角色:持有一个策略类的引用,最终给客户端调用的。

一个抽象策略角色:

java 代码
package org.strategy;
/**
* 抽象策略角色
*/
public abstract class AbstractStrategy { public abstract String calculate(float a,float b);
}

几个具体策略角色:

java 代码
package org.strategy;
/**
* 具体策略角色
*/
public class SubStrategy extends AbstractStrategy{ public String calculate(float a,float b){
float result = a-b;
return "相减结果为:" + result;
}
}
java 代码
package org.strategy;
/**
* 具体策略角色
*/
public class AddStrategy extends AbstractStrategy{ public String calculate(float a,float b){
float result = a+b;
return "相加结果为:" + result;
}
}
java 代码
package org.strategy;
/**
* 具体策略角色
*/
public class MultStrategy extends AbstractStrategy{ public String calculate(float a,float b){
float result = a*b;
return "相乘结果为:" + result;
}
}
java 代码
package org.strategy;
/**
* 具体策略角色
*/
public class DivisionStrategy extends AbstractStrategy{ public String calculate(float a,float b){
float result = a/b;
return "相除结果为:" + result;
}
}

环境角色:

java 代码
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;
}
}

客户端调用:

java 代码
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的更多相关文章

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

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

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

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

  3. Java中的策略模式,完成一个简单地购物车,两种付款策略实例教程

    策略模式是一种行为模式.用于某一个具体的项目有多个可供选择的算法策略,客户端在其运行时根据不同需求决定使用某一具体算法策略. 策略模式也被称作政策模式.实现过程为,首先定义不同的算法策略,然后客户端把 ...

  4. JAVA中的策略模式

    现在我们有一个虚基类-鸭子(abstract Duck). 有真鸭子,野鸭子,橡皮鸭子继承了该类.虚基类有swing方法,毕竟游泳是所有的鸭子都应有的功能.还有一个虚方法display,这个方法在子类 ...

  5. java中的策略设计模式

    本文主要讲java中的策略模式:一个可以根据不同的传入参数而具有不同行为的方法,就叫策略模式.概念可能有点不好理解,具体看下面代码: import java.util.Arrays; /** * 策略 ...

  6. java设计模式 策略模式Strategy

    本章讲述java设计模式中,策略模式相关的知识点. 1.策略模式定义 策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户.策略模式属于对象的 ...

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

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

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

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

  9. Java设计模式之策略模式(Strategy)

    前言: 最近一直在学习基于okHttp网络请求,学习的过程中就想起了之前项目中有这么一个需求不同的接口要采用不同的加密方式,比如登录之前要采用RSA加密,登录之后要采用AES加密,当时是采用靠传递一个 ...

随机推荐

  1. windows下python -m pip install --upgrade pip升级后报错的解决方法

    前言: 笔者装某库的时候提示需要升级pip版本,就python -m pip install --upgrade pip默认升级了,结果升级之后只要输入pip就有报错(如下图),网上百度了很多解决方法 ...

  2. 构建前端第7篇之---elementUI设置主题,进而改变全局button底色

    张艳涛写于2020-1-20 What:是elementUI主题? 是内置的格式,elementUI默认只有一个主题,如果想整体替换按钮的颜色等问题,那么就可以用主题 设置步骤 在路径src/styl ...

  3. 裸奔mysql

    centos 7 下裸奔mysql # vim /etc/my.cnf在[mysqld]的段中加上一句:skip-grant-tables例如:[mysqld]datadir=/var/lib/mys ...

  4. 图解 HTTP 连接管理

    熟悉我的小伙伴都知道,我之前肝了本<HTTP 核心总结>的 PDF,这本 PDF 是取自我 HTTP 系列文章的汇总,然而我写的 HTTP 相关内容都是一年前了,我回头看了一下这本 PDF ...

  5. InnoDB锁机制-转载

    InnoDB锁机制 1. 锁类型 锁是数据库区别与文件系统的一个关键特性,锁机制用于管理对共享资源的并发访问. InnoDB使用的锁类型,分别有: 共享锁(S)和排他锁(X) 意向锁(IS和IX) 自 ...

  6. 计算机网络part2——物理层

    物理层概述 1.物理层基本概念 物理层解决如何在连接各种计算机的传输媒体上传输数据比特流,而不是指具体的传输媒体. 主要任务:确定与传输媒体接口有关的一些特性 特性: 机械特性 电气特性 功能特性 规 ...

  7. js原始数据类型有哪些,引用数据类型有哪些

    js的数据类型划分方式为 原始数据类型和 引用数据类型 栈: 原始数据类型(Undefined,Null,Boolean,Number.String) 堆: 引用数据类型(对象.数组.函数) 两种类型 ...

  8. BUUCTF[强网杯 2019]随便注(堆叠注入)

    记一道堆叠注入的题.也是刷BUU的第一道题. ?inject=1' 报错 ?inject=1'--+ //正常 存在注入的.正常查询字段数,字段数为2.在联合查询的时候给了新提示 ?inject=0' ...

  9. ABP框架使用Oracle数据库,并实现从SQLServer中进行数据迁移的处理

    ABP框架的数据访问底层是基于EFCore(Entity Framework Core)的,是微软标志性且成熟的ORM,因此它本身是支持多种主流数据库MySQL,SqlServer,Oracle,SQ ...

  10. SpringMVC学习01(什么是SpringMVC)

    1.什么是SpringMVC 1.1 回顾MVC 1.1.1 什么是MVC MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范. 是将业务逻辑.数据 ...