策略模式(Strategy)简介
一、策略模式(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)简介的更多相关文章
- 反馈法学习设计模式(一)——策略模式Strategy Pattern
简介(Introduction) 之前学习Java8实战时,遇到一个很好的策略模式示例.便想着借着这个示例结合反馈式的方法来,学习策略设计模式,也以便后面反复琢磨学习. 首先我们通过练习,逐步写出符合 ...
- 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)
在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了“工厂模式”.“策略模式”.“状态模式”等.当然在重构时,有的地 ...
- 【转】设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成 ...
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...
- 设计模式 - 策略模式(Strategy Pattern) 具体解释
策略模式(Strategy Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权全 ...
- HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern)
策略模式(Strategy Pattern): 定义了了算法簇,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户端. 第一个设计原则:找出应用中可能需要变化之处,把他们独立 ...
- 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)
原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...
- 策略模式 Strategy 政策Policy 行为型 设计模式(二十五)
策略模式 Strategy 与策略相关的常见词汇有:营销策略.折扣策略.教学策略.记忆策略.学习策略.... “策略”意味着分情况讨论,而不是一概而论 面对不同年龄段的人,面对不同的商品,必然将会 ...
- 策略模式-Strategy(Java实现)
策略模式-Strategy 在策略模式中,一个类(策略使用者)可以更改自己的执行策略. 比如以排序算法为例子, 多种排序算法都归属于排序算法, 但是实现的算法细节不同, 使用者可以很轻松地替换策略, ...
- [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型)
[.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模 ...
随机推荐
- php的哈希函数
哈希函数: echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT)."\n"; 验证函数: boolean ...
- MYSQL 慢日志
http://blog.chinaunix.net/uid-9950859-id-122259.html
- python测试开发django-10.django连接mysql
前言 Django 对各种数据库提供了很好的支持,包括:PostgreSQL.MySQL.SQLite.Oracle.本篇以mysql为例简单介绍django连接mysql进行数据操作 Django连 ...
- javax.mail 遇到501 mail from address must be same as authorization user 的問題
使用不同的兩個帳戶发送email时,第一个账户可以发送成功,但到第二个账户的时候就报出了501 mail from address must be same as authorization user ...
- quartz终止正在运行的任务
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.net.UR ...
- matlab 使用OPENCV
+cv就是 测试: h=cv.imread('c:\h.jpg');
- [转]C++之运算符重载(2)
上一节主要讲解了C++里运算符重载函数,在看了单目运算符(++)重载的示例后,也许有些朋友会问这样的问题.++自增运算符在C或C++中既可以放在操作数之前,也可以放在操作数之后,但是前置和后置的作用又 ...
- 学习MongoDB-应用举例(利用java操作MongoDB)
Java驱动程序是MongoDB最早的驱动,已用于生产环境很长时间,十分稳定.可以到MongoDB官方网站下载驱动,驱动版本为2.9.0. 这个jar文件中,有两个包,我们会经常用到com.mongo ...
- json的好处-新一代数据传输利器
JSON是一种轻量级的数据交换格式!和xml一样. 为什么不XML XML的冗余太大,不过XML阅读起来比较方面,所以并没有被json完全取代,很多时候都是并存.比如sina微博的开发平台有一个JSO ...
- 第二章 Javac编译原理
注:本文主要记录自<深入分析java web技术内幕>"第四章 javac编译原理" 1.javac作用 将*.java源代码文件转化为*.class文件 2.编译流程 ...