一、策略模式(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. Go语言Web框架gwk介绍 (三)

    上一篇忘了ChanResult ChanResult 可以用来模拟BigPipe,定义如下 type ChanResult struct { Wait sync.WaitGroup Chan chan ...

  2. 精简高效CSS系列之二——浮动float

    一.浮动基础知识 假如一个页面上有3个div块,如下排列: 图1:不使用浮动 图2:向右浮动 图2说明了框1脱离了文档流向右移动,直到它的右边缘碰到包含框的右边缘为止. 图3:向左浮动 图3说明了框1 ...

  3. Node.js modules you should know about: request

    Hey everyone! This is the fourth post in my new node.js modules you should know about article series ...

  4. 用最简单的例子理解迭代器模式(Iterator Pattern)

    迭代器模式的需求来自:需要对一些集合进行迭代,而迭代的方式可能有很多种. 说到迭代,动作大致包括设置第一个位置,获取下一个位置元素,判断是否迭代结束,获取当前位置元素,大致就这么些.把这些迭代动作封装 ...

  5. 使用Lazy<T>实现对客户订单的延迟加载

    "延迟加载"是指在需要的时候再加载数据.比如获得一个Customer信息,并不会把该Customer的Orders信息一下加载出来,当需要显示Orders的时候再加载.简单来说,就 ...

  6. 再次理解多线程线程安全问题(理解java内存模型后)

    1.多线程访问的共享资源存在线程安全问题, 无外乎访问两种共享资源. 1)多线程访问方法区数据.存在线程安全问题,通过加锁 2)多线程访问实例变量:被访问对象是单例时存在线程安全,被访问对象是多例时, ...

  7. Ext ComboBox 动态查询

    Ext中的combobox有属性typeAhead:true 可以实现模糊匹配,但是是从开始匹配的,如果需要自定的的匹配,则需要监听beforequery方法,实现自己的匹配查询方法: var gfx ...

  8. Python Post img

    from poster.encode import multipart_encode from poster.streaminghttp import register_openers import ...

  9. noise_process.c

    #include <math.h>#include "otdr_const.h"#include "haar.h"#include "ot ...

  10. 数据库实例: STOREBOOK > 表空间 > 编辑 表空间: TEMP

    ylbtech-Oracle:数据库实例: STOREBOOK  >  表空间  >  编辑 表空间: TEMP 表空间  >  编辑 表空间: TEMP 1. 一般信息返回顶部 1 ...