一、策略模式概述

  策略模式对应于解决某一个问题的一个算法族,允许用户从该算法族中任选一种算法解决一个问题,同时可以方便的更换算法或者增加新的算法。并且由客户端决定调用哪个算法。

  策略模式的本质:

    分离算法,选择实现。

二、策略模式场景导入

  某公司市场部在接单时根据不同的客户进行报价,可以划分为以下几种类型:

    (1)新客户小批量报价

    (2)新客户大批量报价

    (3)老客户小批量报价

    (4)老客户大批量报价

  当遇到这种情况时,可以采用策略模式实现。

三、使用普通方式实现报价操作

 /**
* 普通方式实现报价
* @author CL
*
*/
public class TestStrategy { public double getPrice(String type, double price) {
if (type.equals("新客户小批量")) {
System.out.println("不打折!");
return price;
} if (type.equals("新客户大批量")) {
System.out.println("打九折!");
return price * 0.9;
} if (type.equals("老客户小批量")) {
System.out.println("打八五折!");
return price * 0.85;
} if (type.equals("老客户大批量")) {
System.out.println("打八折!");
return price * 0.8;
} return price;
} public static void main(String[] args) {
TestStrategy strategy = new TestStrategy(); System.out.printf("您该报价:%6.2f", strategy.getPrice("老客户小批量", 998)); System.out.println("\n---------------------------"); System.out.printf("您该报价:%6.2f", strategy.getPrice("新客户大批量", 1024));
} }

  控制台输出:

打八五折!
您该报价:848.30
---------------------------
打九折!
您该报价:921.60

  注意:实现起来很容易,符号一般开发人员的思路。但是,假如类型很多,算法比较复杂时,整个条件语句的代码就变得很长,难于维护。如果有新增类型,就需要频繁的修改代码。

       不符合开闭原则!

四、使用策略模式实现报价操作

 /**
* 策略模式
* @author CL
*
*/
public interface Strategy { public double getPrice(double originalCost); }
 /**
* 新客户小批量
* @author CL
*
*/
public class NewCustomerFewStrategy implements Strategy { @Override
public double getPrice(double originalCost) {
System.out.println("不打折!");
return originalCost;
} }
 /**
* 新客户大批量
* @author CL
*
*/
public class NewCustomerManyStrategy implements Strategy { @Override
public double getPrice(double originalCost) {
System.out.println("打九折!");
return originalCost * 0.9;
} }
 /**
* 老客户小批量
* @author CL
*
*/
public class OldCustomerFewStrategy implements Strategy { @Override
public double getPrice(double originalCost) {
System.out.println("打八五折!");
return originalCost * 0.85;
} }
 /**
* 老客户大批量
* @author CL
*
*/
public class OldCustomerManyStrategy implements Strategy { @Override
public double getPrice(double originalCost) {
System.out.println("打八折!");
return originalCost * 0.8;
} }
 /**
* 负责和具体的策略类交互
* 使策略模式,使具体的算法和直接的客户调用分离,使算法可以独立于客户端进行独立变化。
* 可以通过构造器注入策略对象的引用,也可以通过set方法注入策略对象的引用。
* 如果使用spring的依赖注入功能,还可以通过配置文件,动态地注入不同的策略对象,动态的切换不同的算法。
* @author CL
*
*/
public class Context { private Strategy strategy; //通过构造器注入
public Context(Strategy strategy) {
this.strategy = strategy;
} //通过set方法注入
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
} public void printPrice(double originalCost) {
System.out.printf("您该报价:%6.2f", strategy.getPrice(originalCost));
} }

  测试:

 /**
* 测试策略模式
* @author CL
*
*/
public class Client { public static void main(String[] args) {
Strategy strategy = new OldCustomerFewStrategy(); //老客户小批量
Context context = new Context(strategy); context.printPrice(998); System.out.println("\n---------------------------"); Strategy strategy2 = new NewCustomerManyStrategy(); //新客户大批量
Context context2 = new Context(strategy2); context2.printPrice(1024); }
}

  控制台输出:

打八五折!
您该报价:848.30
---------------------------
打九折!
您该报价:921.60

五、策略模式常见开发应用场景

  (1)市场系统中的报价功能;

  (2)医保系统中根据不同的人缴纳不同的保险费用;

  (3)…………

GOF23设计模式之策略模式(strategy)的更多相关文章

  1. 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)

    原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...

  2. 反馈法学习设计模式(一)——策略模式Strategy Pattern

    简介(Introduction) 之前学习Java8实战时,遇到一个很好的策略模式示例.便想着借着这个示例结合反馈式的方法来,学习策略设计模式,也以便后面反复琢磨学习. 首先我们通过练习,逐步写出符合 ...

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

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

  4. 8.6 GOF设计模式四: 策略模式… Strategy Pattern

    策略模式… Strategy Pattern  在POS系统中,有时需要实行价格优惠, 该如何处理?  对普通客户或新客户报全价  对老客户统一折扣5%  对大客户统一折扣10%  注:课件 ...

  5. 二十四种设计模式:策略模式(Strategy Pattern)

    策略模式(Strategy Pattern) 介绍定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例有一个Message实体类,对它的操作有 ...

  6. 【GOF23设计模式】策略模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_策略模式.CRM中报价策略.GUI编程中布局管理器底层架构 package com.test.strategy; /** ...

  7. [设计模式] 21 策略模式 Strategy

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对策略模式是这样说的:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.该模式使得算法可独立于使用它的客户而变化. 策略模 ...

  8. 大熊君说说JS与设计模式之------策略模式Strategy

    一,总体概要 1,笔者浅谈 策略模式,又叫算法簇模式,就是定义了不同的算法,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 策略模式和工厂模式有一定的类似,策略模式相对简单容易理解,并 ...

  9. 设计模式之策略模式Strategy

    /** * 策略设计模式 * 策略模式:定义一系列的算法族,使他们之间可以相互转换,动态的改变其行为. * 问题:设计一个鸭子模拟游戏. * 现在有一群鸭子: * ①这些鸭可以有飞的行为(分为快和慢) ...

随机推荐

  1. 十、dbms_shared_pool(提供了对共享池的一些过程和函数访问)

    1.概述 作用:提供了对共享池的一些过程和函数访问,它使用户可以显示共享池中的对象尺寸,绑定对象到共享池,清除绑定到共享池的对象.为了使用该包,必须运行dbmspool.sql脚本来建立该包. 2.包 ...

  2. 【javascript基础】运算符优先级

    优先级 运算类型 关联性 运算符 1 成员运算符 从左到右 . [] new 从右到左 new 2 函数调用运算符 从左到右 () 3 自增运算符 n/a ++ 自减运算符 n/a -- 4 逻辑非运 ...

  3. easyui(1)

    使用Easyui1.引入必要的文件 1).jquery核心库 2).easyui核心库 3).easyui中文提示信息 4).自己开发的js文件 5).easyui核心UI文件css 6).easyu ...

  4. window环境下创建Flask项目需要安装常见模块命令

    安装Flask环境 pip install flask==0.10.1 使用命令行操作 pip install flask-script 创建表单 pip install flask-wtf 操作数据 ...

  5. Http权威指南(cookie以及web认证机制)

    其实对于cookie,想必大家都不陌生,cookie目前主要用于客户端的识别技术. 说到客户端识别技术,就不得不说一个登录态的问题了.登录态顾名思义,用于验证用户的登录与否. 1.登录态 对于PC端网 ...

  6. [Scala]Scala学习笔记六 文件

    1. 读取行 读取文件,可以使用scala.io.Source对象的fromFile方法.如果读取所有行可以使用getLines方法: val source = Source.fromFile(&qu ...

  7. python常用模块之sys模块

    python常用模块之sys模块 1.sys.argv[]:命令行参数List,第一个元素是程序本身 # 写一个简单的python程序,代码如下: #!/usr/bin/python #coding= ...

  8. python中处理命令行参数的模块optpars

    optpars是python中用来处理命令行参数的模块,可以自动生成程序的帮助信息,功能强大,易于使用,可以方便的生成标准的,符合Unix/Posix 规范的命令行说明.使用 add_option() ...

  9. Sprint Boot 学习Q&A

    [ERROR] Failed to execute goal pl.project13.maven:git-commit-id-plugin:2.1.11:revision (default) on ...

  10. 全面进军javascript!

    前两天经过新华书店,进去转了转,又买了两本书.这次买的是<javascript学习指南>和<HTML5经典实例>(都是图灵动物系列,我已经有三本了*^_^*),其实我是想去买& ...