网文提到表格驱动,总喜欢拿一层if做例子,然而这样未免也太简单.

下文是三层缩进的if和表驱动比较,大家可自行判断优劣.

业务是这样的,某景点分旺季票价和淡季票价,淡季票为旺季的一半,15岁以下孩子再减半,60岁以上老人再三三折,成人中有军官证的再打二五折,有士兵证的打两折.(假定非实际业务,勿对号入座)

代码:

package tabledriven;

/**
 *   门票计价器
 * 传统方式和表格驱动比较
 *
 */
public class TicketCalculater {
    // Price
    private double price=144;

    // discout array
    private int[][][] arr= {
                                {
                                    {2*4,2*5,2*1},
                                    {2*2,2*2,2*2},
                                    {2*3,2*3,2*3},
                                },
                                {
                                    {1*4,1*5,1*1},
                                    {1*2,1*2,1*2},
                                    {1*3,1*3,1*3},
                                },
                           };

    // Traditional
    public double getPriceTraditional(int month,Person person) {
        double discount=1;

        if(6<month && month<11) {
            discount*=1;

            if(person.getAge()<15) {
                discount*=0.5;
            }else if(person.getAge()>60) {
                discount*=0.33333333333333;
            }else {
                if(person.isOfficer()) {
                    discount*=0.25;
                }else if(person.isSoldier()) {
                    discount*=0.20;
                }
            }
        }else {
            discount*=0.5;

            if(person.getAge()<15) {
                discount*=0.5;
            }else if(person.getAge()>60) {
                discount*=0.333333333333333;
            }else {
                if(person.isOfficer()) {
                    discount*=0.25;
                }else if(person.isSoldier()) {
                    discount*=0.20;
                }
            }
        }

        return price*discount;
    }

    // Table driven
    public double getPriceTableDriven(int month,Person person) {
        double discount=1;

        int index1,index2,index3;

        if(6<month && month<11) {
            index1=1;
        }else {
            index1=0;
        }

        if(person.getAge()<15) {
            index2=1;
        }else if(person.getAge()>60) {
            index2=2;
        }else {
            index2=0;
        }

        if(person.isOfficer()) {
            index3=0;
        }else if(person.isSoldier()) {
            index3=1;
        }else {
            index3=2;
        }

        discount=arr[index1][index2][index3];

        return price/discount;
    }

    // Entry point
    public static void main(String[] args) {
        TicketCalculater tc=new TicketCalculater();

        Person p1=new Person(30,false,false);
        System.out.println("Ticket price="+round2DecimalPlaces(tc.getPriceTraditional(2, p1)));
        System.out.println("Ticket price(Table)="+round2DecimalPlaces(tc.getPriceTableDriven(2, p1)));

        Person p2=new Person(14,false,false);
        System.out.println("Ticket price="+round2DecimalPlaces(tc.getPriceTraditional(5, p2)));
        System.out.println("Ticket price(Table)="+round2DecimalPlaces(tc.getPriceTableDriven(5, p2)));

        Person p3=new Person(44,true,false);
        System.out.println("Ticket price="+round2DecimalPlaces(tc.getPriceTraditional(8, p3)));
        System.out.println("Ticket price(Table)="+round2DecimalPlaces(tc.getPriceTableDriven(8, p3)));

        Person p4=new Person(68,false,true);
        System.out.println("Ticket price="+round2DecimalPlaces(tc.getPriceTraditional(11, p4)));
        System.out.println("Ticket price(Table)="+round2DecimalPlaces(tc.getPriceTableDriven(11, p4)));
    }

    // round two decimal places of a double
    public static String round2DecimalPlaces(double d){
        java.text.DecimalFormat df =new java.text.DecimalFormat("#0.00");
        return df.format(d);
    }
}

Person类:

package tabledriven;

public class Person {
    private int age;
    private boolean isOfficer;
    private boolean isSoldier;

    public Person(int age,boolean isOfficer,boolean isSoldier) {
        this.age=age;
        this.isOfficer=isOfficer;
        this.isSoldier=isSoldier;
    }

    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public boolean isOfficer() {
        return isOfficer;
    }
    public void setOfficer(boolean isOfficer) {
        this.isOfficer = isOfficer;
    }
    public boolean isSoldier() {
        return isSoldier;
    }
    public void setSoldier(boolean isSoldier) {
        this.isSoldier = isSoldier;
    }
}

运行结果:

Ticket price=72.00
Ticket price(Table)=72.00
Ticket price=36.00
Ticket price(Table)=36.00
Ticket price=36.00
Ticket price(Table)=36.00
Ticket price=24.00
Ticket price(Table)=24.00

--END-- 2019-12-11 14:01

多层If语句 和 表格驱动 的对比的更多相关文章

  1. Linux与Windows的设备驱动模型对比

    Linux与Windows的设备驱动模型对比 名词缩写: API 应用程序接口(Application Program Interface ) ABI 应用系统二进制接口(Application Bi ...

  2. JS010. 三元运算符扩展运用(多层判断语句 / 多条表达式)

    MDN - 三元运算符 语法 Condition ? exprIfTrue : exprIfFalse 用例: function getFee(isMember) { return(isMember ...

  3. 任务驱动,对比式学习.NET开发系列之开篇------开源2个小框架(一个Winform框架,一个Web框架)

    一 源码位置 1. Winform框架 2. web框架 二 高效学习编程的办法 1 任务驱动方式学习软件开发 大部分人学习软件开发技术是通过看书,看视频,听老师上课的方式.这些方式有一个共同点即按知 ...

  4. 4 - SQL Server 2008 之 使用SQL语句删除表格

    使用删除表格的SQL命令与删除数据的命令一样,只是删除的是表格这个对象, 语法如下:DROP TABLE 表名 一般在删除表格之前,需判断这个表格存不存在,存在则删除,不存在则不进行执行任何代码. 代 ...

  5. golang的表格驱动测试

    一.leetcode的算法题 package main import ( "fmt" "strings" ) func lengthOfNonRepeating ...

  6. [转帖]Docker五种存储驱动原理及应用场景和性能测试对比

    Docker五种存储驱动原理及应用场景和性能测试对比 来源:http://dockone.io/article/1513 作者: 陈爱珍 布道师@七牛云   Docker最开始采用AUFS作为文件系统 ...

  7. python init 方法 与 sql语句当前时间对比

    def init(self,cr): tools.sql.drop_view_if_exists(cr, 'custrom_product_infomation_report') cr.execute ...

  8. Docker存储驱动之OverlayFS简介

    简介 OverlayFS是一种和AUFS很类似的文件系统,与AUFS相比,OverlayFS有以下特性: 1) 更简单地设计: 2) 从3.18开始,就进入了Linux内核主线: 3) 可能更快一些. ...

  9. python中if语句和循环语句

    //2019.12.05 python循环控制结构(一)控制循环结构 1-1 程序的判断语句与组合1.对于python的控制结构主要有以下三大类:(1)分支结构(2)循环结构(3)异常处理 2.pyt ...

随机推荐

  1. c# ArrayList 类

  2. angularcli 第二篇(数据绑定、属性申明、绑定属性)

    1.数据绑定 插值绑定: <li>{{ hero.name }} </li>       或       <div  class = "{{ demo }}&q ...

  3. JQuery EasyUI treegrid展开与折叠,以及数据加载两次的问题

    问题:做项目的时候遇到代码生成的页面,只默认展开了一级节点,每次操作之后刷新还要手动一级一级展开,太麻烦了 官方API:http://www.jeasyui.net/plugins/186.html ...

  4. 采用MySQL-MMM做DB高可用时,遇到的一个小坑

    一.服务器分布   二.MySQL-MMM 配置 (1).公共配置[所有DB节点:Master1.Master2.Slave1.Slave2   Monitor节点] # vim /etc/mysql ...

  5. mysql.jdbc.Driver异常总结

    1.registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web applic ...

  6. Enterprise Architect 14破解版 安装包 安装教程

    安装包以及破解补丁下载: 链接:https://pan.baidu.com/s/1es0wN_6-d9pk4xnSN1SiFA 提取码:bor0 安装包链接失效可在下方留言 安装以及破解教程 参考链接 ...

  7. 2019ICPC徐州网络赛 A.Who is better?——斐波那契博弈&&扩展中国剩余定理

    题意 有一堆石子,两个顶尖聪明的人玩游戏,先取者可以取走任意多个,但不能全取完,以后每人取的石子数不能超过上个人的两倍.石子的个数是通过模方程组给出的. 题目链接 分析 斐波那契博弈有结论:当且仅当石 ...

  8. P4462 [CQOI2018]异或序列 莫队

    题意:给定数列 \(a\) 和 \(k\) ,询问区间 \([l,r]\) 中有多少子区间满足异或和为 \(k\). 莫队.我们可以记录前缀异或值 \(a_i\),修改时,贡献为 \(c[a_i\bi ...

  9. (尚010)Vue列表的搜素和排序

    1.test010.html <!DOCTYPE html><html lang="en"><head> <meta charset=&q ...

  10. 洛谷 P2661 信息传递 题解

    P2661 信息传递 题目描述 有 \(n\) 个同学(编号为 \(1\) 到 \(n\) )正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为 \(i\) 的同学的信息传 ...