策略模式(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篇的更多相关文章

  1. 策略模式-Java实现

    策略模式—Java实现 1. 现实需求 本人现在负责开发和维护考核督办系统,其中一个模块叫编写工作计划.是工作计划就要有时间,我们的各种提醒都做了,但是还是有人把x月的工作计划内容写到y月,真心无语了 ...

  2. 设计模式之第8章-策略模式(Java实现)

    设计模式之第8章-策略模式(Java实现) “年前大酬宾了啊,现在理发冲500送300,冲1000送500了.鱼哥赶紧充钱啊,理发这事基本一个月一回,挺实惠的啊.不过话说那个理发店的老板好傻啊,冲10 ...

  3. 策略模式—Java实现(转)

    1. 现实需求 客户有了新的需求,这时我们直接新增策略即可,改很少的代码.基本符合我们面向对象原则中的开闭原则(对扩展开放,对修改关系),实现了高内聚低耦合. 2. 策略模式定义 策略模式,又叫算法簇 ...

  4. StrategyPattern(策略模式)-----Java/.Net

    在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 ...

  5. 装饰者模式--Java篇

    装饰者模式(Decorator):动态地给一个对象添加一些额外的职责,就增加功能来说,装饰者模式比生成子类更为灵活. 1.定义接口,可以动态的给对象添加职责. package com.lujie; p ...

  6. 简单工厂模式-Java篇

    简单工厂模式就是考虑如何实例化对象的问题,就是说到底要实例化谁,将来会不会增加实例化对象,比如计算器类中增加开根元素,应该考虑用一个单独的类来创造实例的过程,这就是工厂.下面将利用计算器类举例,解释简 ...

  7. Strategy策略模式

    策略模式定义了一系列算法,把它们一个个封装起来,并且使它们可相互替换.该模式可使得算法能独立于使用它的客户而变化.Strategy模式是行为模式,正因为他是一种行为模式,所以他不是用来解决类的实例化的 ...

  8. JDK设计模式之——策略模式(Comparable和Comparator接口)

    策略模式:其实就是java的多态...父类引用指向子类对象. 使用策略模式,改善排序算法上文中需要排序的是一个数组 让他可以对任何类型的数组进行排序 1.利用 接口 Comparable<T&g ...

  9. Java进阶篇设计模式之十一 ---- 策略模式和模板方法模式

    前言 在上一篇中我们学习了行为型模式的访问者模式(Visitor Pattern)和中介者模式(Mediator Pattern).本篇则来学习下行为型模式的两个模式,策略模式(Strategy Pa ...

随机推荐

  1. hdu4183往返经过至多每一个点一次/最大流

    题意:从s到t,每一个点有f值,仅仅能从f值小的到大的.到T后回来.仅仅能从f值大的到 小的,求可行否. 往返,事实上就是俩条路过去(每一个点最多一次).所以想到流量为2,跑最大流.看是否满2,又要每 ...

  2. Redis管理key命令

    1 DEL key该命令用于在 key 存在时删除 key. 2 DUMP key 序列化给定 key ,并返回被序列化的值. 3 EXISTS key 检查给定 key 是否存在. 4 EXPIRE ...

  3. mac for smartSVN9 (8,9)破解方法 附smartSvn_keygen工具图文

    mac for  smartSVN9 (8,9)破解方法 附smartSvn_keygen工具 工具文件下载: http://files.cnblogs.com/files/xueshanshan/s ...

  4. nhibernate的关系

    用nhibernate,觉得比较难把握的是其中表间的关系. 我用的是Fluently Nhibernate,直接用代码,而不是XML来书写代码与数据表的映射.其中表间关系有3种: 1.Referenc ...

  5. python itertools

    1 product 1.1 一个generator函数 因此它的返回值是一个iterator,可以用for遍历. 1.2 计算product的参数分类 1.2.1 dict和list 只用了dict的 ...

  6. Cron Expression

    CronTrigger CronTriggers往往比SimpleTrigger更有用,如果您需要基于日历的概念,而非SimpleTrigger完全指定的时间间隔,复发的发射工作的时间表.CronTr ...

  7. XMU 1050 Diffuse Secret 【最短路】

    1050: Diffuse Secret Time Limit: 500 MS  Memory Limit: 64 MBSubmit: 10  Solved: 8[Submit][Status][We ...

  8. mongodb05---游标

    游标cursor: 通俗的说,游标不是查询结果,而是查询的返回资源,或者接口. 通过这个接口,你可以逐条读取.就像php中的fopen打开文件,得到一个资源一样, 通过资源,可以一行一行的读文件. v ...

  9. bzoj1560: [JSOI2009]火星藏宝图

    考虑到一个性质,A到B的距离一定不小于A到C再到B的距离,因为能够到达这三个点不可能构成锐角三角形 对于当前点的更新只需要找那些无法经过其它点再到当前点的点,相当于是一个y坐标单调减的上凸包,随便维护 ...

  10. HDU1255 覆盖的面积 —— 求矩形交面积 线段树 + 扫描线 + 离散化

    题目链接:https://vjudge.net/problem/HDU-1255 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. Input输入数据的第一行是一个正整数T(1<= ...