首先贴一段代码:

package xiao;

import java.util.Scanner;

class CashSuper{
    private int num;
    private double price;
    public int getNum() {
        return num;
    }
    public void setNum(int num) {
        this.num = num;
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }
    public double acceptCash(double money){
        return money;
    }
}
class CashNormal extends CashSuper{
}
class CashRebate extends CashSuper{
    private double rebate;
    public CashRebate(double rebate){
        this.rebate = rebate;
    }
    public double getRebate() {
        return rebate;
    }
    public void setRebate(double rebate) {
        this.rebate = rebate;
    }
    public double acceptCash(double money){
        return money*rebate;
    }    
}
class CashReturn extends CashSuper{
    private double moneyCondition;
    private double moneyReturn;
    public CashReturn(double moneyCondition,double moneyReturn){
        this.moneyCondition = moneyCondition;
        this.moneyReturn = moneyReturn;
    }
    public double getMoneyCondition() {
        return moneyCondition;
    }
    public void setMoneyCondition(double moneyCondition) {
        this.moneyCondition = moneyCondition;
    }
    public double getMoneyReturn() {
        return moneyReturn;
    }
    public void setMoneyReturn(double moneyReturn) {
        this.moneyReturn = moneyReturn;
    }
    public double acceptCash(double money){
        if(money > moneyCondition){
            return money - Math.floor(money/moneyCondition)*moneyReturn;
        }else{
            return money;
        }
    }    
}
class CashFactory{
    public static CashSuper creatCash(String select){
        CashSuper cash = new CashSuper();
        Scanner in = new Scanner(System.in);
        switch(select){
        case"normal":
            cash = new CashNormal();
            break;
        case"rebate":
            System.out.print("please enter the rebate: ");
            double rebat = in.nextDouble();
            cash = new CashRebate(rebat);
            break;
        case"return":
            System.out.print("please enter the moneyCondition: ");
            double moneyCondition = in.nextDouble();
            System.out.print("please enter the moneyReturn: ");
            double moneyReturn = in.nextDouble();
            cash = new CashReturn(moneyCondition,moneyReturn);
            break;
        }
        in.close();
        return cash;
    }
}
class CashContext{
    CashSuper cs =null;
    Scanner in = new Scanner(System.in);
    public CashContext(String type){
        switch(type){
        case"normal":
            CashNormal cash0 = new CashNormal();
            cs = cash0;
            break;
        case"rebate":
            System.out.print("please enter the rebate: ");
            double rebat = in.nextDouble();
            CashRebate cash1 = new CashRebate(rebat);
            cs = cash1;
            break;
        case"return":
            System.out.print("please enter the moneyCondition: ");
            double moneyCondition = in.nextDouble();
            System.out.print("please enter the moneyReturn: ");
            double moneyReturn = in.nextDouble();
            CashReturn cash2 = new CashReturn(moneyCondition,moneyReturn);
            cs = cash2;
            break;
        }
    }
    public double GetResult(double money){
        return cs.acceptCash(money);
    }
}

public class TestDemo{
    public static void main(String[] args)throws Exception{
        Scanner in = new Scanner(System.in);
        System.out.print("please enter the price: ");
        double price = in.nextDouble();
        System.out.print("please enter the num: ");
        int num = in.nextInt();
        System.out.print("please enter the select: ");
        String select = in.next();
        CashContext csuper = new CashContext(select);
        System.out.println(csuper.GetResult(num*price));
        in.close();
    }
}

策略模式:一种定义一系列算法的方法。所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。

策略模式是用来封装算法的,只要在分析过程中听到需要再不同时间应用不同的业务规则,就可以考虑。

Chapter 2.策略模式的更多相关文章

  1. C++ 之 策略模式

    1  会飞的鸭子 Duck 基类,包含两个成员函数 swim() 和 display():派生类 MallardDuck,RedheadDuck 和 RubberDuck,各自重写 display() ...

  2. Python设计模式: 最佳的"策略"模式实践代码

    Python设计模式: 最佳的"策略"模式实践代码 今天抽空看了下流畅的python,发现里面介绍了不少python自带的库的使用实例,用起来非常的优雅. 平时用Python来写爬 ...

  3. javascript设计模式:策略模式

    前言 策略模式有效利用组合.委托.多态等技术和思想,可以有效避免多重条件选择语句. 策略模式对开放-封闭原则提供了很好的支持,将算法封装在strategy中,使得他们易于切换.理解.扩展. 策略模式中 ...

  4. StrategyPattern (策略模式)

    /** * 策略模式 * @author TMAC-J * 根据环境的不同选择不同的策略,把策略用接口抽象出来 */ public class StrategyPattern { interface ...

  5. JAVA 设计模式之策略模式

    定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换. 类型:行为类模式 策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这些类实现相同的接口,相互之间可以替换.在前面说过 ...

  6. Java设计模式之策略模式(Strategy)

    前言: 最近一直在学习基于okHttp网络请求,学习的过程中就想起了之前项目中有这么一个需求不同的接口要采用不同的加密方式,比如登录之前要采用RSA加密,登录之后要采用AES加密,当时是采用靠传递一个 ...

  7. 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)

    在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了“工厂模式”.“策略模式”.“状态模式”等.当然在重构时,有的地 ...

  8. 《Head First 设计模式》之策略模式

    作者:Grey 原文地址:http://www.cnblogs.com/greyzeng/p/5915202.html 模式名称 策略模式(Strategy Pattern) 需求 模拟鸭子游戏,游戏 ...

  9. 学C#之设计模式系列笔记(1)策略模式

    一.借鉴说明 1.<Head First Design Patterns>(中文名<深入浅出设计模式>) 2.维基百科,策略模式,https://zh.wikipedia.or ...

随机推荐

  1. Spark学习资料

    1. 倾情大奉送--Spark入门实战系列 2. Spark GraphX: http://blog.csdn.net/bluejoe2000/article/details/44308167

  2. python --appium搭建环境过程 ---新手总结(大牛勿喷,新手互相交流)

    首先安装python 安装包:https://yunpan.cn/cSdYZqjJ4xDZ3  访问密码 4bf9 1.安装pip   cd 到pip安装包  python setup.py inst ...

  3. Linux必学的60个命令【转载】

    Linux提供了大量的命令,利用它可以有效地完成大量的工 作,如磁盘操作.文件存  [转载地址]http://blog.chinaunix.net/uid-16728139-id-3154272.ht ...

  4. html常用标签有哪些?

    html看似复杂,其实常用的标签并不多,这里总共介绍一些html的常用标签 文字处理: ①标题:<h1> to <h6> ②段落:<p>文字段落</p> ...

  5. COB封装的优势

    随着固态照明技术的不断进步,COB(chip-on-board)封装技术得到越来越多的重视,由于COB光源有热阻低,光通量密度高,眩光少,发光均匀等特性,在室内外照明灯具中得到了广泛的应用,如筒灯,球 ...

  6. 基于Visual C++2013拆解世界五百强面试题--题13-找最大公共子字符串

    编程实现:找出两个字符串中最大公共子字符串,如"abccade"和"dgcadde"的最大子字符串为"cad". 如果不考虑效率的话直接比较 ...

  7. 基于Visual C++2013拆解世界五百强面试题--题11-查找数字出现次数

    在排序数组中,找出给定数字出现的次数比如{ 1, 2, 2, 2, 3}中2的出现次数是3次 我们可使用二分查找发,分别查找出2最先出现的位置和最后出现的位置相减即可. 下面是上代码: #includ ...

  8. HDU 2147 kiki's game

    题解:画图可得当横纵坐标均为奇数时为必败态…… #include <cstdio> int main(){ int a,b; while(scanf("%d%d",&a ...

  9. 微信开放平台 获取 component_verify_ticket

    <?php /** * @author zhaozhuobin * @date:2016-06=07 * */ namespace common\components;use DOMDocume ...

  10. PHP学习笔记9-生成图片

    用PHP代码在网页上生成图片 <?php /** * Created by PhpStorm. * User: Administrator * Date: 2015/6/29 * Time: 2 ...