一、策略模式(Strategy)简介

策略模式是行为模式.

行为模式:规定了各个对象应该具备的职责以及对象间的通信模式,它很好的规范了对象间调用和数据传递方式

策略模式适合于算法经常变化的情况

算法的变化不会影响到使用算法的客户,算法可以独立于使用它的客户所变化

二、简单例子

普通客户,会员,VIP会员购买商品价格不一样

抽象类

package strategy;
/*
* 计算商品价格的抽象类
*/
public abstract class Account { abstract public double getPrice(int amount,double d); }

普通

package strategy;
/**
* 普通客户商品价格计算
*/
public class CommonAccount extends Account { @Override
public double getPrice(int amount, double price) { return amount*price;
} }

会员

package strategy;
/**
* 普通会员商品价格计算打9折
*/
public class InsiderAccount extends Account { @Override
public double getPrice(int amount, double price) {
return amount*price*9/10;
} }

VIP

package strategy;
/**
* VIP会员商品价格计算打8折
*/
public class VipAccount extends Account { @Override
public double getPrice(int amount, double price) { return amount*price*8/10;
} }

上下文类

package strategy;
/**
* 此类用于维护策略类的引用
*/
public class Context {
//引用
private Account account;
//初始化
public Context(Account account){
this.account=account;
}
//调用计算方法
public double doAccount(int amount, double d){
return account.getPrice(amount, d);
} }

测试类

package strategy;
/**
* 此策略模式测试类
*/
public class Test { public static void main(String[] args) {
// 声明商品
String name = "DVD";
int amount = 2;
double price = 50;
double sum = 0;
// 声明对象
// 普通客户
Context context = new Context(new CommonAccount());
sum = context.doAccount(amount, price);
System.out.println("普通客户:没有折扣,购买的商品名称: " + name + " 数量: "
+ amount + " 单价:" + price + " 应付金额:" + sum);
// 普通会员
context = new Context(new InsiderAccount());
sum = context.doAccount(amount, price);
System.out.println("普通会员:9折优惠,购买的商品名称: " + name + " 数量: "
+ amount + " 单价:" + price + " 应付金额:" + sum);
// VIP
context = new Context(new VipAccount());
sum = context.doAccount(amount, price);
System.out.println("VIP客户:8折优惠,购买的商品名称: " + name + " 数量: "
+ amount + " 单价:" + price + " 应付金额:" + sum); } }

结果:

普通客户:没有折扣,购买的商品名称:    DVD       数量:   2      单价:50.0      应付金额:100.0
普通会员:9折优惠,购买的商品名称: DVD 数量: 2 单价:50.0 应付金额:90.0
VIP客户:8折优惠,购买的商品名称: DVD 数量: 2 单价:50.0 应付金额:80.0

策略模式(Strategy)简介的更多相关文章

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

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

  2. 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)

    在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了“工厂模式”.“策略模式”.“状态模式”等.当然在重构时,有的地 ...

  3. 【转】设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成 ...

  4. 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...

  5. 设计模式 - 策略模式(Strategy Pattern) 具体解释

    策略模式(Strategy Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权全 ...

  6. HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern)

    策略模式(Strategy Pattern): 定义了了算法簇,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户端. 第一个设计原则:找出应用中可能需要变化之处,把他们独立 ...

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

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

  8. 策略模式 Strategy 政策Policy 行为型 设计模式(二十五)

    策略模式 Strategy   与策略相关的常见词汇有:营销策略.折扣策略.教学策略.记忆策略.学习策略.... “策略”意味着分情况讨论,而不是一概而论 面对不同年龄段的人,面对不同的商品,必然将会 ...

  9. 策略模式-Strategy(Java实现)

    策略模式-Strategy 在策略模式中,一个类(策略使用者)可以更改自己的执行策略. 比如以排序算法为例子, 多种排序算法都归属于排序算法, 但是实现的算法细节不同, 使用者可以很轻松地替换策略, ...

  10. [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型)

    [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模 ...

随机推荐

  1. ROS知识(16)----如何编译时自动链接同一个工作空间的其他包的头文件(包含message,srv,action自动生成的头文件)

    catkin_make编译时,往往需要自动链接同一个工作空间的其他包的头文件.否则会出现类似如下的错误: /home/xx/xx_ws/srcA_package/src/db.hpp:13:26: f ...

  2. jquery 图片预加载

    /图片无序预加载 (function($){ function Preload(imgs,fns){ this.imgs=(typeof imgs==="string")?[img ...

  3. Polly简介 — 2. 弹性策略

    和故障处理策略不同的是,弹性策略并不是针对委托执行过程中的异常进行处理,而是改变委托本身的行为,因此弹性策略并没有故障定义这一过程,它的处理流程为: 定义策略 应用策略 Polly对弹性策略也做了不少 ...

  4. 使用Chrome快速实现数据的抓取(三)——JQuery

    使用Chrome抓取页面一个非常方便的地方就是它可以执行JS,也就是说我们可以通过JS函数获取我们想要的数据.一个非常强大易用的库就是Jquery,本文就简单的介绍一下使用Chrome获取数据时Jqu ...

  5. both, either, neither的用法

    http://www.yywords.com/Article/200806/347.html  1. 这三个词都用来谈论两者:both 意为“(两者)都”,either意为“(两者中)任意一个”,ne ...

  6. linux系统编程:线程原语

    线程原语 线程概念 线程(thread),有时被称为轻量级进程(Lightweight Process,LWP).是程序运行流的最小单元.一个标准的线程由线程ID.当前指令指针(PC),寄存器集合和堆 ...

  7. [cocos2dx笔记003] Vs2013添加静态库project

    (基于2.2.2版本号.用vs2013编辑代码)(cppblog版本号:http://www.cppblog.com/zdhsoft/archive/2014/05/11/206890.html) 在 ...

  8. myeclipse 修改freemarker ftl 不重启tomcat

    最 近的项目是SSH,View层采用Freemarker,但是遇到了一个很大问题,每次修改完ftl文件,都要重新启动tomcat才可以看到所修改的内 容,不但麻烦,而且浪费时间,特别怀念jsp,后来在 ...

  9. 使用开源库 TWMessageBarManager 展示系统级别的通知

    TWMessageBarManager 简单翻译 https://github.com/terryworona/TWMessageBarManager An iOS manager for prese ...

  10. JAVA常见算法题(三十五)

    判断一个整数能被几个9整除. public static void main(String[] args) { f(729); f(730); } public static void f(int n ...