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
/** * 策略设计模式 * 策略模式:定义一系列的算法族,使他们之间可以相互转换,动态的改变其行为. * 问题:设计一个鸭子模拟游戏. * 现在有一群鸭子: * ①这些鸭可以有飞的行为(分为快和慢) ...
随机推荐
- 小练习:补数 (Number Complement)
1.eamples Input: Output: Explanation: The binary representation of (no leading zero bits), and its c ...
- Mit-Scheme 安装小记
Win10 到 http://www.gnu.org/software/mit-scheme/ 下载对应平台的安装包,我下载的是windows 版本 安装到本地后只出现一个快捷方式MIT-GNU Sc ...
- Javascript-- jQuery动画篇(2)
动画效果 前面的 hide/show,slide in/out 其实也具有动画效果,本篇介绍使用 animate()实现自定义动画效果. 基本语法如下: $(selector).animate({pa ...
- Pavilion M4-1016TX 加装固态硬盘(SSD)+UEFI+GPT安装WIN8.1
折腾了一天,终于将电脑加上SSD和装上系统,记录下,方便后面忘记使用. 步骤: 1.Pavilion M4-1016TX内置了mSata的接口,大小是全高的.ssd支持大小官方说法是测试过32g的,目 ...
- Java 方法重载与方法重写
方法重载(Overload): 1.在同一个类中 2.方法名相同 3.参数的个数或类型不同 4.与方法的返回类型无关 5.与方法的修饰符无关 方法重写(Override): 方法重写必须是子类继承父类 ...
- I2S音频总线学习(二)I2S总线协议
http://blog.csdn.net/ce123_zhouwei/article/details/6919954
- windows7 下python3.6 下Scripts文件夹为空
windows7 下python3.6 下Scripts文件夹为空,安装后不能运行pip,这个时候输入命令: python -m ensurepip 会自动安装pip,然后运行pip3 list就可以 ...
- (转)MapReduce Design Patterns(chapter 3 (part 2))(六)
Top Ten Pattern Description Top ten模式跟前面的有很大的不同,跟输入数据大小无关,最终得到的记录数量是确定的.而在通用filtering中,输出的规模取决于输入数据. ...
- linux命令-xz
tar.xz文件如何压缩解压xz是绝大数linux默认就带的一个压缩工具,压缩率很高. xz压缩文件方法 默认压缩等级是6.要设置压缩率加入参数 -0 到 -9调节压缩率. xz -z [文件名] 不 ...
- kubeadm搭建kubernetes集群之二:创建master节点
在上一章kubeadm搭建kubernetes集群之一:构建标准化镜像中我们用VMware安装了一个CentOS7虚拟机,并且打算用这个虚拟机的镜像文件作为后续整个kubernetes的标准化镜像,现 ...