策略模式--Java篇
策略模式(Strategy):它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。
下面将以商场打折为例子,说明策略模式。商场收银如何促销,用打折还是返利其实都是一些算法,用简单工厂来生产算法对象,这没有错,但算法本身只是一种策略,最重要的是这些算法是随时都可能互相替换的,这就是变化点,而封装变化点是我们面向对象的一种很重要的思维方式。
1.Strategy类,定义所有支持的算法的公共接口:
package com.lujie;
//抽象算法类
public interface CashSuper {
//算法方法
public abstract double acceptCash(double money);
}
2.ConcreteStrategy,封装了具体的算法或行为,继承与strategy
package com.lujie;
//打折收费子类
public class CashRebate implements CashSuper{
private double moneyRebate=1d;
public void setMoneyRebat(double moneyRebat) {
this.moneyRebate = moneyRebat;
}
public double getMoneyRebat() {
return moneyRebate;
}
@Override
public double acceptCash(double money) {
return money*moneyRebate;
}
public CashRebate(String moneyRebate) {
// TODO Auto-generated constructor stub
this.moneyRebate=Double.valueOf(moneyRebate).doubleValue();
}
}
package com.lujie; //返利收费子类
public class CashReturn implements CashSuper{ private double moneyCondition=0.0d;
private double moneyReturn=0.0d;
public void setMoneyCondition(double moneyCondition) {
this.moneyCondition = moneyCondition;
}
public void setMoneyReturn(double moneyReturn) {
this.moneyReturn = moneyReturn;
}
public double getMoneyCondition() {
return moneyCondition;
}
public double getMoneyReturn() {
return moneyReturn;
}
public CashReturn(String moneyCondition,String moneyReturn) {
// TODO Auto-generated constructor stub
this.moneyCondition=Double.valueOf(moneyCondition).doubleValue();
this.moneyReturn=Double.valueOf(moneyReturn).doubleValue();
}
@Override
public double acceptCash(double money) {
// TODO Auto-generated method stub
double result=money;
if(money>=moneyCondition)
result=money-Math.floor(money/moneyCondition)*moneyReturn;
return result;
}
}
package com.lujie;
//正常收费子类
public class CashNormal implements CashSuper{
@Override
public double acceptCash(double money) {
// TODO Auto-generated method stub
return money;
}
}
3.Context,用一个ContreteStrategy来配置,维护一个对strategy对象的引用。
package com.lujie;
//策略模式
public class CashContext {
private CashSuper cs;//声明一个CashSuper对象
public CashContext(String type) {//注意参数不是具体的收费策略对象,
//而是一个字符串,表示收费类型
//初始化时,传入具体的策略对象
switch (type) {
case "正常收费":
CashNormal cs0=new CashNormal();//根据具体的策略对象,调用器算法的方法
cs=cs0;
break;
case "满300返100":
CashReturn cs1=new CashReturn("300","100");
cs=cs1;
break;
case "打8折":
CashRebate cs2=new CashRebate("0.8");
cs=cs2;
break;
//将实例化具体策略的过程由客户端转移到Context类中,简单工厂的应用
}
}
public double getResult(double money) {
return cs.acceptCash(money);
}
}
4.测试用例:
package com.lujie; public class testStrategyMethod { public static void main(String[] args) {
testStrategyMethod test=new testStrategyMethod();
test.getResult("正常收费");
test.getResult("满300返100");
test.getResult("打8折");
}
public void getResult(String type) {
double total=0.0d;
// TODO Auto-generated method stub
CashContext csSuper=new CashContext(type);
double totalPrices=0d;
totalPrices=csSuper.getResult(3000);
total=total+totalPrices;
System.out.println(type+"为:"+total);
} }
5.测试结果:
策略模式--Java篇的更多相关文章
- 策略模式-Java实现
策略模式—Java实现 1. 现实需求 本人现在负责开发和维护考核督办系统,其中一个模块叫编写工作计划.是工作计划就要有时间,我们的各种提醒都做了,但是还是有人把x月的工作计划内容写到y月,真心无语了 ...
- 设计模式之第8章-策略模式(Java实现)
设计模式之第8章-策略模式(Java实现) “年前大酬宾了啊,现在理发冲500送300,冲1000送500了.鱼哥赶紧充钱啊,理发这事基本一个月一回,挺实惠的啊.不过话说那个理发店的老板好傻啊,冲10 ...
- 策略模式—Java实现(转)
1. 现实需求 客户有了新的需求,这时我们直接新增策略即可,改很少的代码.基本符合我们面向对象原则中的开闭原则(对扩展开放,对修改关系),实现了高内聚低耦合. 2. 策略模式定义 策略模式,又叫算法簇 ...
- StrategyPattern(策略模式)-----Java/.Net
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 ...
- 装饰者模式--Java篇
装饰者模式(Decorator):动态地给一个对象添加一些额外的职责,就增加功能来说,装饰者模式比生成子类更为灵活. 1.定义接口,可以动态的给对象添加职责. package com.lujie; p ...
- 简单工厂模式-Java篇
简单工厂模式就是考虑如何实例化对象的问题,就是说到底要实例化谁,将来会不会增加实例化对象,比如计算器类中增加开根元素,应该考虑用一个单独的类来创造实例的过程,这就是工厂.下面将利用计算器类举例,解释简 ...
- Strategy策略模式
策略模式定义了一系列算法,把它们一个个封装起来,并且使它们可相互替换.该模式可使得算法能独立于使用它的客户而变化.Strategy模式是行为模式,正因为他是一种行为模式,所以他不是用来解决类的实例化的 ...
- JDK设计模式之——策略模式(Comparable和Comparator接口)
策略模式:其实就是java的多态...父类引用指向子类对象. 使用策略模式,改善排序算法上文中需要排序的是一个数组 让他可以对任何类型的数组进行排序 1.利用 接口 Comparable<T&g ...
- Java进阶篇设计模式之十一 ---- 策略模式和模板方法模式
前言 在上一篇中我们学习了行为型模式的访问者模式(Visitor Pattern)和中介者模式(Mediator Pattern).本篇则来学习下行为型模式的两个模式,策略模式(Strategy Pa ...
随机推荐
- 项目已经部署,tomcat已经启动,网址也没问题,却出现404错误
这个有可能是tomcat在初始化资源的时候发生了异常...判断tomcat是否发生异常就是看tomcat启动日志里有没有报错就行了. 另一种原因就是可能是修改了项目名称.因为web名称实际上是没有跟着 ...
- (八)unity4.6Ugui中文教程文档-------概要-UGUI Rich Text
大家好,我是孙广东. 转载请注明出处:http://write.blog.csdn.net/postedit/38922399 更全的内容请看我的游戏蛮牛地址:mod=guide&view ...
- 扩展HtmlHelper
eg3:扩展HtmlHelper 扩展方法类 1 public static class HtmlExtension 2 { 3 /// ...
- Pulse-code modulation
脉冲编码调制(Pulse Code Modulation,PCM),由A.里弗斯于1937年提出的,这一概念为数字通信奠定了基础,60年代它开始应用于市内电话网以扩充容量,使已有音频电缆的大部分芯线的 ...
- RDD变换
对Key/Value型RDD进行变换 groupBy按Key汇聚 fruit,applevegetable,cucumberfruit,cherryvegetable,beanfruit,banana ...
- unbantu16.04安装jdk
1,解压缩jdk到指定目录 2,修改目录,方便使用 3,配置环境变量 sudo gedit /etc/environment 末尾加入以下配置(JAVA_HOME 后的路径就是jdk的文件位置) PA ...
- Java用户注册代码
<div class="registerbox"> <sf:form class="form-Register" name="for ...
- iOS 7 present/dismiss转场动画
前言 iOS 7以后提供了自定义转场动画的功能,我们可以通过遵守协议完成自定义转场动画.本篇文章讲解如何实现自定义present.dismiss自定义动画. 效果图 本篇文章实现的动画切换效果图如下: ...
- 函数,#include <>和#include " "区别
l 4..函数定义到使用分三步:1.声明.2.定义函数.3.调用函数. 2.函数的定义格式:返回值 函数名(形参列表){ 函数体; return } 命名规则:1.只能由字母.数字.下划线或者美元符号 ...
- 认识虚拟化(virtualization)
0. 基本定义 虚拟化的本质是将现有的计算机资源通过虚拟化的技术分割成若干个计算机资源,这些计算机资源互相独立:其最终目标是提高计算机的利用效率以最大化计算机的灵活性: 虚拟化为数据.计算能力.存储资 ...