1、前言
停车场系统也是一个经典的管理系统,主体是停车场系统,input 是车辆,output 是车位。所以有一个 Vehicle 作为公共父类,有 Bus、Motobike、Car 等一些公共子类。有一个 ParkingLot(停车场),和一个 ParkingSpot(停车位)。
2、设计
在此基础上,我们假设是分楼层的那种停车场,那么会有一个 Level,Level 里会有很多 ParkingSpot,而 ParkingLot 持有 Level。
所以 ParkingLot 最主要的就是两个方法,parkVehicle(Vehicle vehicle) 和 leaveVehicle(Ticket ticket),当车走的时候,ParkingLot 进行一下计费。当然,他的停车或者离开最终而言是调用 ParkingSpot 的方法,毕竟它才是本质上提供功能的类。
它们的类图关系如下:
类图
3、代码
Vehicle:
public class Vehicle {
private SizeType type;
public Vehicle(SizeType type) {
this.type = type;
}
public SizeType getType() {
return type;
}
public void setType(SizeType type) {
this.type = type;
}
}
Ticket:
public class Ticket {
/**
* 停了哪一辆车
*/
private Vehicle vehicle;
/**
* 开始停车时间
*/
private Date startTime;
public Ticket(Vehicle vehicle, Date startTime) {
this.vehicle = vehicle;
this.startTime = startTime;
}
public Vehicle getVehicle() {
return vehicle;
}
public void setVehicle(Vehicle vehicle) {
this.vehicle = vehicle;
}
public Date getStartTime() {
return startTime;
}
public void setStartTime(Date startTime) {
this.startTime = startTime;
}
}
SizeType:
public enum SizeType {
SMALL,
MEDIUM,
LARGE;
public static SizeType random(){
Random random = new Random();
return SizeType.values()[random.nextInt(3)];
}
}
ParkingLot:
public class ParkingLot {
/**
* 有哪些层
*/
private List<Level> levels;
/**
* 每毫秒收费
*/
private float costOneMS = 5;
public ParkingLot() {
this.levels = new ArrayList<>();
for(int i = 1; i <= 1; i++){
Level level = new Level(new ArrayList<>(), 4, i);
for(int j = 1; j <= level.getAvaliableCount(); j++){
level.getParkingSpots().add(new ParkingSpot(SizeType.random(), level, true));
}
this.levels.add(level);
}
}
public boolean canVehicleFit(Vehicle vehicle){
for (Level level : this.levels) {
if(level.canVehicleFit(vehicle)){
return true;
}
}
return false;
}
public Ticket parkVehicle(Vehicle vehicle){
for (Level level : this.levels) {
if(level.parkVehicle(vehicle)){
return new Ticket(vehicle, new Date());
}
}
return null;
}
public void leaveVehicle(Ticket ticket){
for (Level level : this.levels) {
if(level.unParkVehicle(ticket.getVehicle())){
calculatePrice(ticket);
return;
}
}
}
private void calculatePrice(Ticket ticket) {
System.out.println("花费了:" + (System.currentTimeMillis() - ticket.getStartTime().getTime()) * this.costOneMS);
}
public static void main(String[] args) {
ParkingLot parkingLot = new ParkingLot();
Ticket ticket = null;
for(int i = 0; i < 10; i++){
Vehicle bus = new Bus();
boolean isFit = parkingLot.canVehicleFit(bus);
if(isFit){
System.out.println("可以停");
ticket = parkingLot.parkVehicle(bus);
}else {
System.out.println("停不了");
}
}
if(ticket != null){
parkingLot.leaveVehicle(ticket);
}
}
}
Level:
public class Level {
/**
* 每层的停车位数量
*/
private List<ParkingSpot> parkingSpots;
/**
* 可用的停车位数量
*/
private int avaliableCount;
/**
* 第几层
*/
private int levelNo;
public Level(List<ParkingSpot> parkingSpots, int avaliableCount, int levelNo) {
this.parkingSpots = parkingSpots;
this.avaliableCount = avaliableCount;
this.levelNo = levelNo;
}
public boolean canVehicleFit(Vehicle vehicle) {
if(this.avaliableCount == 0){
return false;
}
for (ParkingSpot parkingSpot : this.parkingSpots) {
if(parkingSpot.canVehicleFit(vehicle)){
return true;
}
}
return false;
}
public boolean parkVehicle(Vehicle vehicle) {
for (ParkingSpot parkingSpot : this.parkingSpots) {
if(parkingSpot.canVehicleFit(vehicle)){
parkingSpot.takeSpot(vehicle);
this.avaliableCount--;
return true;
}
}
return false;
}
public boolean unParkVehicle(Vehicle vehicle){
for (ParkingSpot parkingSpot : this.parkingSpots) {
if(parkingSpot.findVehicle(vehicle)){
this.avaliableCount++;
parkingSpot.leavelSpot(vehicle);
return true;
}
}
return false;
}
public List<ParkingSpot> getParkingSpots() {
return parkingSpots;
}
public void setParkingSpots(List<ParkingSpot> parkingSpots) {
this.parkingSpots = parkingSpots;
}
public int getAvaliableCount() {
return avaliableCount;
}
public void setAvaliableCount(int avaliableCount) {
this.avaliableCount = avaliableCount;
}
public int getLevelNo() {
return levelNo;
}
public void setLevelNo(int levelNo) {
this.levelNo = levelNo;
}
}
ParkingSpot:
/**
* @author xushu
* @create 5/1/22 1:44 PM
* @desc 如果是有几层的那种停车楼,那么停车场持有的就是 Level 的引用,否则直接持有 ParkingSpot 的引用就行
*/
public class ParkingSpot {
/**
* 车位类型
*/
private SizeType type;
/**
* 停了什么车
*/
private Vehicle vehicle;
/**
* 在哪个楼层
*/
private Level level;
/**
* 是否可用
*/
private boolean avaliable;
public ParkingSpot(SizeType type, Level level, boolean avaliable) {
this.type = type;
this.level = level;
this.avaliable = avaliable;
}
public boolean canVehicleFit(Vehicle vehicle) {
return avaliable && this.type.equals(vehicle.getType());
}
public void takeSpot(Vehicle vehicle){
this.avaliable = false;
this.vehicle = vehicle;
}
public void leavelSpot(Vehicle vehicle){
this.avaliable = true;
this.vehicle = null;
}
public boolean findVehicle(Vehicle vehicle){
return !avaliable && this.vehicle.equals(vehicle);
}
public SizeType getType() {
return type;
}
public void setType(SizeType type) {
this.type = type;
}
public Vehicle getVehicle() {
return vehicle;
}
public void setVehicle(Vehicle vehicle) {
this.vehicle = vehicle;
}
public Level getLevel() {
return level;
}
public void setLevel(Level level) {
this.level = level;
}
}
网友评论