策略模式(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. JavaScript基本类型与引用类型(二)

    前文已经对基本类型和引用类型作了简单的介绍,本文将进一步介绍基本类型和引用类型. 基本包装类型 为了方便操作基本类型的值,JavaScript提供了特殊的引用类型:Boolean.Number.Str ...

  2. 2016/04/18 session cookie 对比 应用 <?php session_start() / setcookie()?>

    ①会话 huihua.php <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

  3. 装饰器的初识,基于bootstrap的前端开发

    1装饰器的初识 概念:不改变函数原来的调用方式,动态地给函数添加功能 开放封闭的原则:1>对添加的新功能是开放的,32>不要在元代码进行修改(封闭) 1.1>函数的定义:对代码块和功 ...

  4. java8--多线程(java疯狂讲义3复习笔记)

    多线程这块,平时用的框架里都封装好了,只有写批处理和工具包时用过几次.现在水平仅仅限于会用的程度,需要全面深入学习多线程. 主要内容:创建线程,启动线程,控制线程,多线程的同步,线程池,使用线程安全的 ...

  5. MVC优缺点

    1.通过把项目分成model view和controller,使得复杂项目更加容易维护. 2.没有使用view state和服务器表单控件,可以更方便的控制应用程序的行为 3.应用程序通过contro ...

  6. (转)Java中JSON字符串与java对象的互换实例详解

    在开发过程中,经常需要和别的系统交换数据,数据交换的格式有XML.JSON等,JSON作为一个轻量级的数据格式比xml效率要高,XML需要很多的标签,这无疑占据了网络流量,JSON在这方面则做的很好, ...

  7. QQ拼音输入法的人机交互

    一.从用户的角度出发: 1.界面简洁,简单 2.在我们有输入要求的时候,上述界面才会出现,当我们不用输入时,他就自动隐藏了 3.具有个性,每个人都能有自己独特的汉字库,也能够显示自己每天输入汉字的个数 ...

  8. MSTAR MIPS DUMP查找方法

  9. 《MIDINET: A CONVOLUTIONAL GENERATIVE ADVERSARIAL NETWORK FOR SYMBOLIC-DOMAIN MUSIC GENERATION》论文阅读笔记

    出处 arXiv.org (引用量暂时只有3,too new)2017.7 SourceCode:https://github.com/RichardYang40148/MidiNet Abstrac ...

  10. linuxmint安装卡在探测文件系统,解决方法。

    今天安装linuxmint17.3,一直卡在探测文件... 解决方法如下: 执行安装程序前,打开终端执行如下命令即可. sudo umount -l /isodevic