一、策略模式概述

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

  策略模式的本质:

    分离算法,选择实现。

二、策略模式场景导入

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

    (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. java程序设计基础篇 复习笔记 第一单元

    java语言程序设计基础篇笔记1. 几种有名的语言COBOL:商业应用FORTRAN:数学运算BASIC:易学易用Visual Basic,Delphi:图形用户界面C:汇编语言的强大功能和易学性,可 ...

  2. 【转】busybox分析——arp设置ARP缓存表中的mac地址

    [转]busybox分析——arp设置ARP缓存表中的mac地址 转自:http://blog.chinaunix.net/uid-26009923-id-5098083.html 1. 将arp缓存 ...

  3. js jq 主动触发事件

    js的自定义事件与触发 //主动触发事件:触发鼠标被按下事件 var btn2 =document.getElementById("btn2"); var btn = docume ...

  4. qml 知识积累

    本文仅仅只是记录,怕日后遗忘. ListView相关应用 https://www.cnblogs.com/SaveDictator/p/8192391.html ListView 清空操作 https ...

  5. 关于python中urllib.urlencode的时候出错:UnicodeEncodeError: ‘ascii’的记录

    原文我参见了:http://hi.baidu.com/setcookie/item/ddc6b694b1f13435336eeb3c 为毛我要费事的写下了,就是为了让自己记录一下,下面的也是直接摘录过 ...

  6. 多线程相关(pthread 、NSThread 、GCD、NSOperation)

    进程 进程是指在系统中正在运行的一个应用程序 线程 1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程) 1个线程中任务的执行是串行的(执行完上一个才能执行下一个) 多线程 1个进程中可以 ...

  7. Vim技能修炼教程(7) - 可视模式

    可视模式 可视模式是与正常模式.插入模式一起并列的模式.它的作用就像图形化编辑器下用鼠标来选择一个块. 在vim下,使用正常模式和ex命令,连搜带跳行的,未必就比用鼠标慢. 我们先做一个例子找找感觉, ...

  8. Linux sed命令操作 删除文件每一行的前k个字符、在文本的行尾或行首添加字符

    删除文件每一行的前k个字符 $ cat tmp.txt # 删除每行第一个字符 $ sed 's/.//' tmp.txt # 删除每行前两个字符 $ sed 's/..//' tmp.txt # 删 ...

  9. python爬虫入门(5)-Scrapy概述

    http://scrapy-chs.readthedocs.io/zh_CN/latest/intro/overview.html   Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框 ...

  10. 显卡、显卡驱动、显存、GPU、CUDA、cuDNN

    显卡 Video card,Graphics card,又叫显示接口卡,是一个硬件概念(相似的还有网卡),执行计算机到显示设备的数模信号转换任务,安装在计算机的主板上,将计算机的数字信号转换成模拟 ...