首先贴一段代码:

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. Java Web 入门(一)使用 Intellij IDEA 14.1.5 创建 Maven Web项目

    1.基础配置 1.1 安装 JDK1.7,配置系统变量:JAVA_HOME 和 Path 1.2 安装 Tomcat 7.0 1.3 安装  Intellij IDEA 14.1.5 1.4 Mave ...

  2. JS中的RegExp对象常用属性和方法

    JavaScript提供了一个RegExp对象来完成有关正则表达式的操作和功能,每一条正则表达式模式对应一个RegExp实例.有两种方式可以创建RegExp对象的实例. 使用RegExp的显式构造函数 ...

  3. shouldOverrideUrlLoading相关说明

    给WebView加一个事件监听对象(WebViewClient)并重写其中的一些方法:shouldOverrideUrlLoading:对网页中超链接按钮的响应.当按下某个连接时WebViewClie ...

  4. php命名空间及和autoload结合使用问题。

    在讨论如何使用命名空间之前,必须了解 PHP 是如何知道要使用哪一个命名空间中的元素的.可以将 PHP 命名空间与文件系统作一个简单的类比.在文件系统中访问一个文件有三种方式: 相对文件名形式如foo ...

  5. perl5 第五章 文件读写

    第五章 文件读写 by flamephoenix 一.打开.关闭文件二.读文件三.写文件四.判断文件状态五.命令行参数六.打开管道 一.打开.关闭文件   语法为open (filevar, file ...

  6. BZOJ 3385: [Usaco2004 Nov]Lake Counting 数池塘

    题目 3385: [Usaco2004 Nov]Lake Counting 数池塘 Time Limit: 1 Sec  Memory Limit: 128 MB Description     农夫 ...

  7. 用elasticsearch索引mongodb数据

    参照网页:单机搭建elasticsearch和mongodb的river 三个步骤: 一,搭建单机replicSet二,安装mongodb-river插件三,创建meta,验证使用 第一步,搭建单机m ...

  8. js中this的深入研究

    this对象是函数在运行时由调用函数的对象决定的: 1.在全局对象中运行函数时,this等于window 2.当函数被作为某个对象的方法调用时, this等于那个对象. 需要注意的几点: 声明函数里的 ...

  9. 利用UICollectionView实现瀑布流

    利用UICollectionView实现瀑布流通过自定义布局来实现. - 自定义类继承UICollectionViewLayout: 必须重写的方法有: //决定每个item的位置: - (nulla ...

  10. Oracle语句优化规则(二)

    21.       用EXISTS替换DISTINCT 当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT. 一般可以考虑用EXIST替换  例如: ...