GOF23设计模式之策略模式(strategy)
一、策略模式概述
策略模式对应于解决某一个问题的一个算法族,允许用户从该算法族中任选一种算法解决一个问题,同时可以方便的更换算法或者增加新的算法。并且由客户端决定调用哪个算法。
策略模式的本质:
分离算法,选择实现。
二、策略模式场景导入
某公司市场部在接单时根据不同的客户进行报价,可以划分为以下几种类型:
(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)的更多相关文章
- 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)
原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...
- 反馈法学习设计模式(一)——策略模式Strategy Pattern
简介(Introduction) 之前学习Java8实战时,遇到一个很好的策略模式示例.便想着借着这个示例结合反馈式的方法来,学习策略设计模式,也以便后面反复琢磨学习. 首先我们通过练习,逐步写出符合 ...
- JAVA设计模式之策略模式 - Strategy
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 ...
- 8.6 GOF设计模式四: 策略模式… Strategy Pattern
策略模式… Strategy Pattern 在POS系统中,有时需要实行价格优惠, 该如何处理? 对普通客户或新客户报全价 对老客户统一折扣5% 对大客户统一折扣10% 注:课件 ...
- 二十四种设计模式:策略模式(Strategy Pattern)
策略模式(Strategy Pattern) 介绍定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例有一个Message实体类,对它的操作有 ...
- 【GOF23设计模式】策略模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_策略模式.CRM中报价策略.GUI编程中布局管理器底层架构 package com.test.strategy; /** ...
- [设计模式] 21 策略模式 Strategy
在GOF的<设计模式:可复用面向对象软件的基础>一书中对策略模式是这样说的:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.该模式使得算法可独立于使用它的客户而变化. 策略模 ...
- 大熊君说说JS与设计模式之------策略模式Strategy
一,总体概要 1,笔者浅谈 策略模式,又叫算法簇模式,就是定义了不同的算法,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 策略模式和工厂模式有一定的类似,策略模式相对简单容易理解,并 ...
- 设计模式之策略模式Strategy
/** * 策略设计模式 * 策略模式:定义一系列的算法族,使他们之间可以相互转换,动态的改变其行为. * 问题:设计一个鸭子模拟游戏. * 现在有一群鸭子: * ①这些鸭可以有飞的行为(分为快和慢) ...
随机推荐
- 由浅入深了解EventBus:(一)
概述 由greenrobot织贡献(该组织还贡献了greenDAO),一个Android事件发布/订阅轻量级框架; EventBus是一个消息总线,以观察者模式实现,用于简化程序的组件.线程通信,可以 ...
- Java 进阶7 并发优化 5 并发控制板方法
Java 进阶7 并发优化 5 并发控制板方法 20131114 前言: Java 中多线程并发程序中存在线程安全的问题,之前学习 Java的同步机制,掌握的同步方法只有一种就是使用 ...
- qt QTableWidget&&QTableView 导出数据到excel
通常情况下,我们在开发过程中比较常用的方法是将表格的数据到处到excel文件.我也在这个点上头疼了很长时间,不过功夫不负苦心人,最终还是勉强达到效果,为了后面再次用到时不手忙脚乱现在将方法寄存在此,如 ...
- redis高级应用特征
Redis高级应用特性 1.安全性 2.主从复制 3.事务处理 4.持久化机制 5.发布订阅消息 6.虚拟内存的使用 安全性 设置客户端连接后进行任何其他指定前需要使用的密码. 警告:因为redis速 ...
- Spring报错: org.springframework.beans.factory.support.BeanDefinitionValidationException: Couldn't find an init method named 'init' on bean with name 'car'(待解答)
在Spring工程里,有一个Car类的bean,Main.java主程序,MyBeanPostProcessor.java是Bean后置处理器. 文件目录结构如下: Car.java package ...
- 《gradle 用户指南中文版》 第一部分、关于Gradle
第一部分.关于Gradle 目录1.介绍1.1 关于本用户指南2.概述2.1 特性2.2 为什么选择Groovy? 上一页 | 目录 | 下一页
- ROS机器人操作系统官方教程、源码汇总
1 wiki: http://wiki.ros.org/ 2 code: https://github.com/ ---- 1 基础教程 https://github.com/ros/ros_tut ...
- [置顶]
针对 CoordinatorLayout 及 Behavior 的一次细节较真
我认真不是为了输赢,我就是认真.– 罗永浩 我一直对 Material Design 很感兴趣,每次在官网上阅读它的相关文档时,我总会有更进一步的体会.当然,Material Design 并不是仅仅 ...
- Learning Scrapy(一)
学习爬虫有一段时间了,从Python的Urllib.Urlllib2到scrapy,当然,scrapy的性能且效率是最高的,自己之前也看过一些资料,在此学习总结下. Scrapy介绍 关于scrapy ...
- slam学习
学习内容: 数学: 线性代数,概率论, 优化理论,离散数学, 李代数, 凸优化: 算法: 概率机器人, 机器人状态估计, 深度学习,非线性优化: 工程: c/c++ , python, ros, ...