一、策略模式概述

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

  策略模式的本质:

    分离算法,选择实现。

二、策略模式场景导入

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

    (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. Linux下第一次Node尝试

    由于需求所定,必须在服务器上使用nodejs,第一次使用过程记录下来. 首先是安装node,这里可以下载到各个版本的node:https://nodejs.org/download/ 我是进入rele ...

  2. 【LeetCode 28_字符串_匹配】Implement strStr()

    解法一:Brute-force int strStr(string haystack, string needle) { int m = haystack.size(); int n = needle ...

  3. 初次使用VCS仿真软件

    由于刚开始接触VCS,对于VCS不是太了解,在网上找了很多的资料终于遇到了一个相对比较初级的入门资料,这个资料是以一个简单的4位加法器为例来介绍vcs的用法的,比较好入门,这个文章的地址如下: htt ...

  4. Java -- 使用阻塞队列(BlockingQueue)控制线程通信

    BlockingQueeu接口是Queue的子接口,但是它的主要作用并不是作为容器,而是作为线程同步的工具. 特征: 当生产者线程试图向BlockingQueue中放入元素时,如果该队列已满,则该线程 ...

  5. PostgreSQL备份工具-pg_backrest(转)

    转自:http://blog.chinaunix.net/uid-7270462-id-5777877.html 官网:https://pgbackrest.org 一.配置集中备份服务器 1.1 备 ...

  6. CSS 清除浮动 clear 属性

    CSS 清除浮动 clear 属性用于设定元素哪一侧不允许有其他浮动元素(而并非取消元素的浮动). 可能的取值如下: 取值 说明 none 默认值,允许两侧都有浮动元素 left 左侧不允许有其他浮动 ...

  7. react 生命周期图

    1. react v16 版本生命周期 2. react v17 (还未发布), 生命周期将被改动,下面红框的部分就是会被删除的部分,注意调整!

  8. 转:java c/s tomcat 三层架构

    概述在c/s结构的发展历程中,产生了两层c/s结构和三层c/s结构之分.在两层c/s结构中,在信息管理系统的管理上主要分为客户端和数据库服务器. 缺点有两个: 1)开销高昂.在两层c/s结构中,为了维 ...

  9. Android程序员学WEB前端(3)-HTML(3)-表单嵌套-Sublime

    转载请注明出处:http://blog.csdn.net/iwanghang/article/details/76522586觉得博文有用,请点赞,请评论,请关注,谢谢!~ 表单嵌套: <!DO ...

  10. 《Drools7.0.0.Final规则引擎教程》第4章 4.5RHS语法

    RHS语法 使用说明 RHS是满足LHS条件之后进行后续处理部分的统称,该部分包含要执行的操作的列表信息.RHS主要用于处理结果,因此不建议在此部分再进行业务判断.如果必须要业务判断需要考虑规则设计的 ...