(1)App
public class App { public static void main(String[] args) { new SharedBikeMgr().menu(); } }
(2)SharedBikeMgr
public class SharedBikeMgr { //有1个类维护操作单车的增删改查的方法----> dao----> BikeDao //在静态代码块里面初始化一些数据 private static SharedBikeCompany[] companyArray; private static final BikeDao bikeDao; public static int ofoId = 1000; public static int haloId = 10000; public static int moBaiId = 2000; static { bikeDao = new BikeDaoImpl(); companyArray = new SharedBikeCompany[3]; AbstractSharedBike[] ofoBikes = new OfoBike[5]; AbstractSharedBike[] haloBikes = new HaloBike[5]; AbstractSharedBike[] moBaiBikes = new MobaiBike[5]; for (int i = 0; i < 5; i++) { ofoBikes[i] = new OfoBike(ofoId, "ofo单车" + ofoId++, BikeEnum.BIKE_BORROWED.getCode(), ""); haloBikes[i] = new HaloBike(haloId, "halo单车" + haloId++, BikeEnum.BIKE_CAN_BORROW.getCode(), ""); moBaiBikes[i] = new MobaiBike(moBaiId, "moBai单车" + moBaiId++, BikeEnum.BIKE_CAN_BORROW.getCode(), ""); } companyArray[0] = SharedBikeCompany.builder().companyId(1).companyName(BikeConstant.OFO_COMPANY_NAME).sharedBikes(ofoBikes).count(20000).sum(5).build(); companyArray[1] = SharedBikeCompany.builder().companyId(2).companyName(BikeConstant.HALO_COMPANY_NAME).sharedBikes(haloBikes).count(19999).sum(5).build(); companyArray[2] = SharedBikeCompany.builder().companyId(3).companyName(BikeConstant.MOBAI_COMPANY_NAME).sharedBikes(moBaiBikes).count(2222).sum(5).build(); } public void menu() { String answer; do { System.out.println("欢迎使用迷你共享单车管理系统"); System.out.println("+++++++++++++++++++++++"); System.out.println(" 1、投放Bike"); System.out.println(" 2、查看Bike"); System.out.println(" 3、删除Bike"); System.out.println(" 4、借出Bike"); System.out.println(" 5、归还Bike"); System.out.println(" 6、Bike排行榜"); System.out.println(" 7、退 出"); System.out.println("+++++++++++++++++++++++"); int choice = InputUtil.inputInt("^[1-7]$", "请录入1-7之间的数字:"); switch (choice) { case 1: putBikeModule(); break; case 2: bikeDao.findAllBikeInfo(companyArray); break; case 3: deleteBileModule(); break; case 4: borrowBikeModule(); break; case 5: returnBikeModule(); break; case 6: rank(); break; case 7: InputUtil.close(); System.out.println("程序结束"); return; } System.out.println("是否继续?y/n"); answer = InputUtil.inputStr(); } while (Objects.equals("y", answer)); InputUtil.close(); System.out.println("程序结束"); } private void rank() { //告诉sort 帮我去排序 //Arrays.sort(companyArray); int length = companyArray.length; SharedBikeCompany[] tempArray = Arrays.copyOf(companyArray, length); for (int i = 1; i < length; i++) { for (int j = 0; j < length - i; j++) { if (tempArray[j].getCount() < tempArray[j + 1].getCount()) { SharedBikeCompany temp = tempArray[j]; tempArray[j] = tempArray[j + 1]; tempArray[j + 1] = temp; } } } //冒泡排序实现 for (SharedBikeCompany company : tempArray) { System.out.println(company.getCompanyName() + "\t" + company.getCount()); } } private void returnBikeModule() { int i = choseCompany(); bikeDao.returnBikeById(companyArray[i - 1]); } private void borrowBikeModule() { int i = choseCompany(); bikeDao.borrowBikeById(companyArray[i - 1]); } private void deleteBileModule() { int i = choseCompany(); bikeDao.deleteBikeById(companyArray[i - 1]); } private int choseCompany() { for (SharedBikeCompany company : companyArray) { System.out.println(company.getCompanyId() + ":" + company.getCompanyName()); } System.out.println("请选择要操作的品牌:"); return InputUtil.inputInt(); } private void putBikeModule() { //具体的公司对象 int id = choseCompany(); System.out.println("请录入要投放的数量:"); int putNum = InputUtil.inputInt(); bikeDao.putBike(companyArray[id - 1], putNum); } }
(3)common包
1.
public interface BikeConstant { String OFO_COMPANY_NAME = "ofo公司"; String HALO_COMPANY_NAME = "HALO公司"; String MOBAI_COMPANY_NAME = "MOBAI公司"; }
2.
@Getter @AllArgsConstructor public enum BikeEnum { BIKE_BORROWED(1, "单车已借出"), BIKE_CAN_BORROW(2, "单车可借"); private final int code; private final String msg; }
(4)dao包下
1.
public interface BikeDao { //查询所有公司下的所有的单车信息 void findAllBikeInfo(SharedBikeCompany[] companyArray); void putBike(SharedBikeCompany sharedBikeCompany, int putNum); void deleteBikeById(SharedBikeCompany company); void borrowBikeById(SharedBikeCompany company); void returnBikeById(SharedBikeCompany company); }
(5)DaoImpl包下
1.
public class BikeDaoImpl implements BikeDao { @Override public void findAllBikeInfo(SharedBikeCompany[] companyArray) { System.out.println("|————————————————————————————————————————————————————|"); System.out.println("|公司序号|公司名称|公司单车数量|公司单车借出次数|"); System.out.println("|————————————————————————————————————————————————————|"); for (SharedBikeCompany company : companyArray) { Integer sum = company.getSum(); System.out.println(company.getCompanyId() + "\t" + company.getCompanyName() + "\t" + sum + "\t" + company.getCount()); //展示当前公司下单车的信息 getBikeInfo(company, sum); System.out.println(); } } private void getBikeInfo(SharedBikeCompany company, Integer sum) { System.out.println("单车序号" + "\t " + "单车名称" + "\t" + "单车状态" + "\t" + "借出时间"); AbstractSharedBike[] bikes = company.getSharedBikes(); for (int index = 0; index < sum; index++) { AbstractSharedBike bike = bikes[index]; String msg = (bike.getStatus() == BikeEnum.BIKE_CAN_BORROW.getCode()) ? BikeEnum.BIKE_CAN_BORROW.getMsg() : BikeEnum.BIKE_BORROWED.getMsg(); System.out.println(bike.getBid() + "\t" + bike.getBikeName() + msg + "\t" + bike.getBorrowTime()); } } @Override public void putBike(SharedBikeCompany company, int putNum) { AbstractSharedBike[] bikes = company.getSharedBikes(); Integer companyId = company.getCompanyId(); //bike的剩余空间不够 要去扩容 Integer sum = company.getSum(); int length = bikes.length; if (putNum > (length - sum)) { System.out.println("空间不足,已经按照规则自动扩容"); bikes = Arrays.copyOf(bikes, (length + putNum) * 2); } for (int i = 1; i <= putNum; i++) { switch (companyId) { case 1: bikes[sum++] = new OfoBike(SharedBikeMgr.ofoId, "ofo单车" + SharedBikeMgr.ofoId++, BikeEnum.BIKE_CAN_BORROW.getCode(), ""); break; case 2: bikes[sum++] = new HaloBike(SharedBikeMgr.haloId, "halo单车" + SharedBikeMgr.haloId++, BikeEnum.BIKE_CAN_BORROW.getCode(), ""); break; case 3: bikes[sum++] = new MobaiBike(SharedBikeMgr.moBaiId, "moBai单车" + SharedBikeMgr.moBaiId++, BikeEnum.BIKE_CAN_BORROW.getCode(), ""); break; } } company.setSum(sum); company.setSharedBikes(bikes); System.out.println("投放" + putNum + "辆<<" + company.getCompanyName() + ">>单车成功"); } @Override public void deleteBikeById(SharedBikeCompany company) { String companyName = company.getCompanyName(); System.out.println("此<<" + companyName + ">>下的单车信息如下:"); Integer sum = company.getSum(); getBikeInfo(company, sum); System.out.println("请录入要删除的单车id:"); int bikeId = InputUtil.inputInt(); AbstractSharedBike[] bikes = company.getSharedBikes(); //执行删除 for (int index = 0; index < sum; index++) { AbstractSharedBike bike = bikes[index]; //找到了这个车 if (bikeId == bike.getBid()) { //单车具有状态 if (bike.getStatus().equals(BikeEnum.BIKE_BORROWED.getCode())) { System.out.println("id为" + bikeId + "单车已经被借出,无法删除"); return; } //可以删除----> 右边的数据向左移动 sum = sum - 1; for (int i = index; i < sum; i++) { bikes[i] = bikes[i + 1]; } bikes[sum] = null; break; } } System.out.println("删除id为" + bikeId + "成功"); company.setSum(sum); } @Override public void borrowBikeById(SharedBikeCompany company) { String companyName = company.getCompanyName(); System.out.println("此<<" + companyName + ">>下的单车信息如下:"); Integer sum = company.getSum(); getBikeInfo(company, sum); System.out.println("请录入要借出的单车id:"); int bikeId = InputUtil.inputInt(); AbstractSharedBike[] bikes = company.getSharedBikes(); //执行借出 for (int index = 0; index < sum; index++) { AbstractSharedBike bike = bikes[index]; //找到了这个车 if (bikeId == bike.getBid()) { //单车具有状态 if (bike.getStatus().equals(BikeEnum.BIKE_BORROWED.getCode())) { System.out.println("id为" + bikeId + "单车已经被借出,无法再被借"); return; } System.out.println("请录入借车时间:(yyyy-MM-dd HH:mm:ss)"); String borrowTime = InputUtil.inputLineStr(); bike.setStatus(BikeEnum.BIKE_BORROWED.getCode()); bike.setBorrowTime(borrowTime); break; } } company.setCount(company.getCount() + 1); System.out.println("借出id为" + bikeId + "单车成功"); } @Override public void returnBikeById(SharedBikeCompany company) { String companyName = company.getCompanyName(); System.out.println("此<<" + companyName + ">>下的单车信息如下:"); Integer sum = company.getSum(); getBikeInfo(company, sum); System.out.println("请录入要归还的单车id:"); int bikeId = InputUtil.inputInt(); AbstractSharedBike[] bikes = company.getSharedBikes(); //执行归还 for (int index = 0; index < sum; index++) { AbstractSharedBike bike = bikes[index]; //找到了这个车 if (bikeId == bike.getBid()) { //单车具有状态 if (bike.getStatus().equals(BikeEnum.BIKE_CAN_BORROW.getCode())) { System.out.println("id为" + bikeId + "单车未借出,无法归还"); return; } System.out.println("请录入归还时间:(yyyy-MM-dd HH:mm:ss)"); String backTime = InputUtil.inputLineStr(); String borrowTime = bike.getBorrowTime(); System.out.println("您的借车时间:" + borrowTime); long money = DateUtil.getDuration(backTime, borrowTime); System.out.println("用车时间是<<" + money + ">>,需要支付:" + money); bike.setStatus(BikeEnum.BIKE_CAN_BORROW.getCode()); bike.setBorrowTime(""); break; } } company.setCount(company.getCount() + 1); System.out.println("归还id为" + bikeId + "单车成功"); } }
(6)entity包下
1.
@Data @AllArgsConstructor @Builder public class SharedBikeCompany { private Integer companyId;// 公司id private String companyName;// ofo 哈罗 摩拜 private AbstractSharedBike[] sharedBikes;// 公司持有共享单车 private Integer sum;//公司单车总量---->就是sharedBikes里面有效单车对象 private Integer count;// 公司单车借出次 }
2.
@Setter @Getter @AllArgsConstructor public abstract class AbstractSharedBike { private Integer bid;// 单车编号 private String bikeName;// 单车名称-->ofo 哈罗 摩拜 private Integer status;// 单车状态--> 0 已借出 1 可借状态 private String borrowTime;// 单车借出时 }
3.
public class OfoBike extends AbstractSharedBike { public OfoBike(Integer bid, String bikeName, Integer status, String borrowTime) { super(bid, bikeName, status, borrowTime); } }
4.
public class HaloBike extends AbstractSharedBike{ public HaloBike(Integer bid, String bikeName, Integer status, String borrowTime) { super(bid, bikeName, status, borrowTime); } }
5.
public class MobaiBike extends AbstractSharedBike{ public MobaiBike(Integer bid, String bikeName, Integer status, String borrowTime) { super(bid, bikeName, status, borrowTime); } }
(7)util包下
1.
public class InputUtil { private InputUtil() { } private static final Scanner scanner; static { scanner = new Scanner(System.in); } //录入一个整数 public static int inputInt(String regex, String msg) { while (true) { System.out.println(msg); String numStr = scanner.next(); if (numStr.matches(regex)) { return Integer.parseInt(numStr); } } } public static int inputInt() { return scanner.nextInt(); } public static void close() { scanner.close(); } public static String inputStr() { return scanner.next(); } public static String inputLineStr() { scanner.nextLine(); return scanner.nextLine(); } }
2.
public class DateUtil { private DateUtil() { } public static long getDuration(String backTime, String borrowTime) { DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { Date backDate = dateFormat.parse(backTime); Date borrowDate = dateFormat.parse(borrowTime); long time = Math.abs(backDate.getTime() - borrowDate.getTime()); return time / 1000 / 3600; } catch (ParseException e) { e.printStackTrace(); } return 0; } }
具体过程如下:
1.创建bike包 com.javasm.bike
2.创建实体类包 com.javasm.bike.bean 或 com.javasm.bike.entity
在entity包下创建SharedBikeCompany类
@Data
@AllArgsConstructor
@Builder
public class SharedBikeCompany {
private Integer companyId;// 公司id
private String companyName;// ofo 哈罗 摩拜
private AbstractSharedBike[] sharedBikes;// 公司持有共享单车
private Integer sum;//公司单车总量---->就是sharedBikes里面有效单车对象
private Integer count;// 公司单车借出次
}
在entity包下创建AbstractSharedBike类:
@Setter
@Getter
@AllArgsConstructor
public abstract class AbstractSharedBike {
private Integer bid;// 单车编号
private String bikeName;// 单车名称-->ofo 哈罗 摩拜
private Integer status;// 单车状态--> 0 已借出 1 可借状态
private String borrowTime;// 单车借出时
}
3.创建App类(在bike包下),做为客户访问入口
public class App {
public static void main(String[] args) {
new SharedBikeMgr().menu();
}
}
4.封装Scanner方法,放在com.javasm.bike.util.InputUtil里:
public class InputUtil {
private InputUtil() {
}
private static final Scanner scanner;
static {
scanner = new Scanner(System.in);
}
//录入一个整数
public static int inputInt(String regex, String msg) {
while (true) {
System.out.println(msg);
String numStr = scanner.next();
if (numStr.matches(regex)) {
return Integer.parseInt(numStr);
}
}
}
public static int inputInt() {
return scanner.nextInt();
}
public static void close() {
scanner.close();
}
public static String inputStr() {
return scanner.next();
}
public static String inputLineStr() {
scanner.nextLine();
return scanner.nextLine();
}
}
5.创建SharedBikeMgr类(在bike包下),做功能菜单
public class SharedBikeMgr {
public void menu() {
String answer;
do {
System.out.println("欢迎使用迷你共享单车管理系统");
System.out.println("+++++++++++++++++++++++");
System.out.println(" 1、投放Bike");
System.out.println(" 2、查看Bike");
System.out.println(" 3、删除Bike");
System.out.println(" 4、借出Bike");
System.out.println(" 5、归还Bike");
System.out.println(" 6、Bike排行榜");
System.out.println(" 7、退 出");
System.out.println("+++++++++++++++++++++++");
int choice = InputUtil.inputInt("^[1-7]$", "请录入1-7之间的数字:");
switch (choice) {
case 1:
//putBikeModule();
break;
case 2:
//bikeDao.findAllBikeInfo(companyArray);
break;
case 3:
//deleteBileModule();
break;
case 4:
//borrowBikeModule();
break;
case 5:
//returnBikeModule();
break;
case 6:
//rank();
break;
case 7:
InputUtil.close();
System.out.println("程序结束");
return;
}
System.out.println("是否继续?y/n");
answer = InputUtil.inputStr();
} while (Objects.equals("y", answer));
InputUtil.close();
System.out.println("程序结束");
}
}
6.准备工作已做完,接下来做功能:
(1)先做查看bike
创建dao包(com.javasm.bike.dao),维护操作单车的增删改查的方法。
在dao包下创建BikeDao接口:(这里将之后的增删改代码也补全)
(接口是对行为的封装)
public interface BikeDao {
//查询所有公司下的所有的单车信息
void findAllBikeInfo(SharedBikeCompany[] companyArray);
void putBike(SharedBikeCompany sharedBikeCompany, int putNum);
void deleteBikeById(SharedBikeCompany company);
void borrowBikeById(SharedBikeCompany company);
void returnBikeById(SharedBikeCompany company);
}
相应的,在SharedBikeMgr类下声明一个BikeDao变量:
private static BikeDao bikeDao;
在功能菜单的case2下增加:
bikeDao.findALLBikeInfo();
接下来写接口实现类,创建impl包(在Dao包下),在该包里创建BikeDaoImpl类,实现接口必然 重写抽象方法:
先重写查看bike这个抽象方法:
public class BikeDaoImpl implements BikeDao {
@Override
public void findAllBikeInfo(SharedBikeCompany[] companyArray) {
System.out.println("|————————————————————————————————————————————————————|");
System.out.println("|公司序号|公司名称|公司单车数量|公司单车借出次数|");
System.out.println("|————————————————————————————————————————————————————|");
for (SharedBikeCompany company : companyArray) {
Integer sum = company.getSum();
System.out.println(company.getCompanyId() + "\t" + company.getCompanyName() + "\t" + sum + "\t" + company.getCount());
//展示当前公司下单车的信息
getBikeInfo(company, sum);
System.out.println();
}
}
private void getBikeInfo(SharedBikeCompany company, Integer sum) {
System.out.println("单车序号" + "\t " + "单车名称" + "\t" + "单车状态" + "\t" + "借出时间");
AbstractSharedBike[] bikes = company.getSharedBikes();
for (int index = 0; index < sum; index++) {
AbstractSharedBike bike = bikes[index];
String msg = (bike.getStatus() == BikeEnum.BIKE_CAN_BORROW.getCode()) ? BikeEnum.BIKE_CAN_BORROW.getMsg() : BikeEnum.BIKE_BORROWED.getMsg();
System.out.println(bike.getBid() + "\t" + bike.getBikeName() + msg + "\t" + bike.getBorrowTime());
}
}
}
相应的,在SharedBikeMgr类下创建对象一定是接口实现类:(多态)
private static BikeDao bikeDao = new BikeDaoImpl();
或者放在静态代码块里:
private static final BikeDao bikeDao;
static{
bikeDao = new BikeDaoImpl();
}