一、策略模式(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. Codeforces Round #351 (VK Cup 2016 Round 3, Div. 2 Edition) B. Problems for Round 水题

    B. Problems for Round 题目连接: http://www.codeforces.com/contest/673/problem/B Description There are n ...

  2. UOJ #17. 【NOIP2014】飞扬的小鸟 背包DP

    #17. [NOIP2014]飞扬的小鸟 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4902  Solved: 1879 题目连接 http:// ...

  3. CF 277.5 A.SwapSort 水题

    //STL教你做人系列 #include<stdio.h> #include<iostream> #include<math.h> #include<algo ...

  4. 用swift开发仪表盘控件(一)

    苹果swift刚刚推出不久,接触到这个语言是一个偶然的机会,无聊之余随便看了下它的语法: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveW5tYW95b2 ...

  5. cocos2d-x 3.0 将cpp-tests编译成Android版本号APK文件

    cmd模式 进入到 E:\cocos2d-x-3.0rc1\cocos2d-x-3.0rc1\build 输入命令 android list targets 在输入: android-build.py ...

  6. C#中的IDisposable模式

    当谈到垃圾回收,在C#中,托管资源的垃圾回收是通过CLR的Garbage Collection来实现的,Garbage Collection会调用堆栈上对象的析构函数完成对象的释放工作:而对于一些非托 ...

  7. 报错:405 Method Not Allowed

    出现错误的原因是:静态文件不能通过post方式访问. 解决办法:改成用get方式访问.

  8. MVC二级联动使用$.ajax方法获取后端返回的字符串

    在"MVC二级联动使用$.getJSON方法"中使用$.getJSON()获取后端返回的JSon. 本篇使用jQuery的$.ajax()获取后端返回的字符串,实现二级联动.   ...

  9. [转载] C# matlab联合编程简介

    原作者  文月 主要操作说明: 1. 找到matlab安装目录下的MCRInstaller.exe安装 MCRInstaller.exe 在安装目录下的 ..\MATLAB7\toolbox\comp ...

  10. tomcat 启动时设置 java 参数,mark

    在文件  startup.bat/.sh 中添加 set "JAVA_OPTS=-Xms2048m -Xmx4096m -XX:NewSize=256m -XX:MaxNewSize=102 ...