如果是最小单位为小时的话,我觉得表结构可以这样:
id
type(用来标识是vip还是普通车位)
date(日期,如果Type为vip,这个就是每月的几号;如果是普通车位,那就是星期几)
hour(小时,如1点、2点、3点等)
price(每小时的价格)
然后在表里面把每种车位的每个小时的默认单价先存到数据库,在管理员设置了某个小时的价格后,直接覆盖数据库里面的默认的那条记录就行了。
这样在计算停车费的时候,就根据停车的车位类型、日期(每月几号或星期几)、hour(停车了好几个小时,就取多条记录进行相加)、price,来计算总金额。
上面是我自己的思路,不知道能不能满足楼主需求。

解决方案 »

  1.   

    想了下,做了些许设计:
    基础类IdEntity:
    package entity;import java.io.Serializable;
    import java.util.Date;/**
     * 统一定义id的entity基类.
     * 
     * 基类统一定义id的属性名称、数据类型、列名映射及生成策略. 子类可重载getId()函数重定义id的列名映射和生成策略.
     */
    public abstract class IdEntity implements Serializable { protected static final long serialVersionUID = Long.MAX_VALUE; private Long id; protected Date createDate = new Date(); public Long getId() {
    return id;
    } public void setId(Long id) {
    this.id = id;
    } public void setCreateDate(Date createDate) {
    this.createDate = createDate;
    } public Date getCreateDate() {
    return createDate;
    } /**
     * 重写equals方法,以id为准判断
     * 
     * @param object
     * 
     * @return boolean
     */
    @Override
    public boolean equals(Object object) { if (this == object) {
    return true;
    } if (object == null) {
    return false;
    } if (object instanceof IdEntity) { IdEntity idEntity = (IdEntity) object;
    // 由于IdEntity是hibernate托管的,所以一定要用getUuid方法,而不能直接用uuid if (this.getId() == null || idEntity.getId() == null) { return false;
    } else { return this.getId().equals(idEntity.getId());
    }
    } return false; } /**
     * 重写hashCode方法,直接返回uuid的hash code
     * 
     * @param hashCode
     * 
     * @return int
     */
    @Override
    public int hashCode() { return getId() == null ? super.hashCode() : getId().hashCode();
    }
    }
    停车位抽象类ParkingSpace:
    package entity;
    public abstract class ParkingSpace extends IdEntity { private static final long serialVersionUID = 1L; private String no; // 停车位编号

    private Type type;

    public ParkingSpace() {
    }

    public static ParkingSpace getInstance(Type type) {

    if (Type.VIP == type) {

    return new VipParkingSpace();
    } else {

    return new GeneralParkingSpace();
    }
    } public String getNo() {
    return no;
    } public void setNo(String no) {
    this.no = no;
    }

    public Type getType() {
    return type;
    } public void setType(Type type) {
    this.type = type;
    } public static enum Type { // 贵宾、普通

    VIP, GENERAL
    }
    }
    贵宾停车位VipParkingSpace:
    package entity;public class VipParkingSpace extends ParkingSpace { private static final long serialVersionUID = 1L; public VipParkingSpace() {

    this.setType(ParkingSpace.Type.VIP);
    }
    }
    普通车位GeneralParkingSpace:
    package entity;public class GeneralParkingSpace extends ParkingSpace { private static final long serialVersionUID = 1L; public GeneralParkingSpace() {

    this.setType(ParkingSpace.Type.GENERAL);
    }
    }
    时间区间基类DateRange:
    package entity;import java.util.Date;public class DateRange extends IdEntity { private static final long serialVersionUID = 1L;

    private String alias; // 区间别名,如"一号", "十五号" private Date startDate;

    private Date endDate; public Date getStartDate() {
    return startDate;
    } public void setStartDate(Date startDate) {
    this.startDate = startDate;
    } public Date getEndDate() {
    return endDate;
    } public void setEndDate(Date endDate) {
    this.endDate = endDate;
    } public String getAlias() {
    return alias;
    } public void setAlias(String alias) {
    this.alias = alias;
    }
    }
    价格策略抽象类PriceStrategy:
    package entity;
    public abstract class PriceStrategy extends IdEntity { private static final long serialVersionUID = 1L;

    private double price;

    public static PriceStrategy getInstance(ParkingSpace.Type type, DateRange dateRange) {

    if (dateRange != null) {

    return new DateRangePriceStrategy(type, dateRange);
    } else {

    return new GeneralPriceStrategy(type);
    }
    } public double getPrice() {
    return price;
    } public void setPrice(double price) {
    this.price = price;
    }
    }
    特殊时间区间价格策略DateRangePriceStrategy:
    package entity;
    public class DateRangePriceStrategy extends PriceStrategy { private static final long serialVersionUID = 1L; private ParkingSpace parkingSpace;

    private DateRange dateRange;

    public DateRangePriceStrategy() {
    }

    public DateRangePriceStrategy(ParkingSpace.Type type, DateRange dateRange) {

    this.parkingSpace = ParkingSpace.getInstance(type);
    this.dateRange = dateRange;
    } public ParkingSpace getParkingSpace() {
    return parkingSpace;
    } public void setParkingSpace(ParkingSpace parkingSpace) {
    this.parkingSpace = parkingSpace;
    } public DateRange getDateRange() {
    return dateRange;
    } public void setDateRange(DateRange dateRange) {
    this.dateRange = dateRange;
    }
    }
    普通时间区间价格策略GeneralPriceStrategy:
    package entity;public class GeneralPriceStrategy extends PriceStrategy { private static final long serialVersionUID = 1L; private ParkingSpace parkingSpace;

    public GeneralPriceStrategy() {
    }

    public GeneralPriceStrategy(ParkingSpace.Type type) {

    this.parkingSpace = ParkingSpace.getInstance(type);
    } public ParkingSpace getParkingSpace() {
    return parkingSpace;
    } public void setParkingSpace(ParkingSpace parkingSpace) {
    this.parkingSpace = parkingSpace;
    }
    }大致如此了,楼主感受下。
      

  2.   

    贵宾停车位和普通停车位的需求不同,贵宾是15号1号特殊,普通是上班时间特殊。你怎么区分?
    你可以好好理解下我说的表的date字段的意义就好了。