final project q8

This commit is contained in:
2022-05-24 23:35:04 +08:00
parent d3cf0c7a7c
commit 3dc6689804
15 changed files with 552 additions and 0 deletions

View File

@@ -0,0 +1,63 @@
/*
* Author: CHEN Yongyuan (Walter) 1930006025 from OOP(1007)
* Date: 2022-04-25
* Description: This is the borrower class.
*/
public class Borrower extends User {
/**
* Constructor.
*
* @param name Borrower's name
* @param int book number of books borrowed by user
*/
public Borrower(String name, int book) throws NotALenderException {
super(name, book);
// check
if (book < 0) {
throw new NotALenderException("A new borrower cannot lend books.");
}
}
/**
* increase the number of books borrowed by the user.
*
* @param number Incrased number of books
* @throws NotALenderException
*/
public void moreBook(int number) throws NotALenderException {
int newBook = getBook() + number;
if (number < 0 && newBook < 0) {
throw new NotALenderException("A borrower cannot lend " + (-newBook) + " book(s).");
}
setBook(newBook);
}
/**
* Test.
*/
public static void testBorrower() {
try {
Borrower b = new Borrower("Bob", -1);
} catch (NotALenderException e) {
System.out.println(e.getMessage().equals("A new borrower cannot lend books."));
}
try {
Borrower b = new Borrower("Bob", 10);
System.out.println(b.getName() == "Bob");
System.out.println(b.getBook() == 10);
b.setBook(5);
System.out.println(b.getBook() == 5);
b.moreBook(2);
System.out.println(b.getBook() == 7);
b.moreBook(-2);
System.out.println(b.getBook() == 5);
b.moreBook(-5);
System.out.println(b.getBook() == 0);
b.moreBook(-1);
} catch (NotALenderException e) {
System.out.println(e.getMessage().equals("A borrower cannot lend 1 book(s)."));
}
}
}

View File

@@ -0,0 +1,145 @@
/*
* Author: CHEN Yongyuan (Walter) 1930006025 from OOP(1007)
* Date: 2022-04-25
* Description: This is the CLI class.
*/
import java.util.InputMismatchException;
import java.util.Scanner;
public class CLI {
private static Scanner input = new Scanner(System.in);
/**
* Read one line from CLI.
*
* @param message Hint printed to screen
* @return one line input
*/
private static String readLine(String message) {
System.out.print(message);
return input.nextLine();
}
/**
* Read one positive integer.
*
* @param message HINT printed to screen
* @return one positive integer
*/
private static int readPosInt(String message) {
while (true) {
System.out.print(message);
try {
int result = input.nextInt();
input.nextLine();
if (result >= 0) {
return result;
} else {
System.out.println("Positive integers only!");
}
} catch (InputMismatchException e) {
System.out.println("You must type an integer!");
input.nextLine();
}
}
}
public static void main(String[] args) {
int book;
String username;
String menuHint = "Type an action (total:1 add:2 get:3 more:4 less:5 quit:6): ";
String userRoleHint = "Type the user role (lender:1 borrower:2): ";
Library library = new Library("UIC Library");
while (true) {
switch (readPosInt(menuHint)) {
// total
case 1:
System.out.println("Total number of borrowed books: "
+ library.totalBorrowedBooks());
break;
// add
case 2:
switch (readPosInt(userRoleHint)) {
// lender
case 1:
username = readLine("Enter the name of the user: ");
book = readPosInt(
"Enter the initial number of borrowed books: ");
Lender lender = new Lender(username, book);
library.addUser(lender);
System.out.println("Lender \"" + username + "\" lending " + book
+ " book(s) has been added.");
break;
// borrower
case 2:
username = readLine(
"Enter the name of the user: ");
book = readPosInt(
"Enter the initial number of borrowed books: ");
try {
library.addUser(new Borrower(username, book));
System.out.println("Borrower \""
+ username
+ "\" borrowing "
+ book
+ " book(s) has been added.");
} catch (NotALenderException e) {
System.out.println("BUG! This must never happen!");
System.exit(1);
}
break;
default:
System.out.println("Unknown user role!");
break;
}
break;
// get
case 3:
username = readLine("Enter the name of the user: ");
try {
System.out.println(username + " borrows "
+ library.getBook(username) + " book(s).");
} catch (UnknownUserException e) {
System.out.println("User " + username + " unknown.");
}
break;
case 4:
username = readLine("Enter the name of the user: ");
book = readPosInt("Enter the number of books: ");
try {
library.moreBook(username, book);
} catch (NotALenderException e) {
System.out.println("BUG! This must never happen!");
} catch (UnknownUserException e) {
System.out.println("User " + username + " unknown.");
}
break;
case 5:
username = readLine("Enter the name of the user: ");
book = readPosInt("Enter the number of books: ");
try {
// decrease numbers
try {
library.moreBook(username, -book);
} catch (NotALenderException e) {
System.out.println("A borrower cannot lend "
+ (-(library.getBook(username) - book))
+ " book(s).");
}
} catch (UnknownUserException e) {
System.out.println("User " + username + " unknown.");
}
break;
case 6:
System.out.println("Goodbye!");
System.exit(0);
break;
default:
System.out.println("Unknown action!");
break;
}
}
}
}

View File

@@ -0,0 +1,7 @@
public class Controller {
protected Library m;
public Controller(Library m) {
this.m = m;
}
}

View File

@@ -0,0 +1,12 @@
/*
* Author: CHEN Yongyuan (Walter) 1930006025 from OOP(1007)
* Date: 2022-04-25
*/
public class ControllerSimple extends Controller {
private Library m;
public ControllerSimple(Library m) {
super(m);
}
}

View File

@@ -0,0 +1,11 @@
public class GUI {
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
Library li = new Library("UIC Library");
ControllerSimple c = new ControllerSimple(li);
ViewSimple v = new ViewSimple(li, c);
}
});
}
}

View File

@@ -0,0 +1,13 @@
/*
* Author: CHEN Yongyuan (Walter) 1930006025 from OOP(1007)
* Date: 2022-04-25
* Description: This is the interface of IUser.
*/
public interface IUser {
public String getName();
public int getBook();
public void moreBook(int number) throws NotALenderException;
}

View File

@@ -0,0 +1,42 @@
/*
* Author: CHEN Yongyuan (Walter) 1930006025 from OOP(1007)
* Date: 2022-04-25
* Description: This is the Lender class.
*/
public class Lender extends User {
/**
* Constructor.
*
* @param name The user's name.
* @param book number of bookds lent by the user. This will be store in negetive value.
*/
public Lender(String name, int book) {
// lender negetive book value
super(name, -book);
}
/**
* Increases the number of bookds.
*
* @param book the number of books.
*/
public void moreBook(int book) {
setBook(getBook() - book);
}
/**
* Test.
*/
public static void testLender() {
Lender l = new Lender("Anna", 5);
System.out.println(l.getName() == "Anna");
System.out.println(l.getBook() == -5);
l.setBook(-6);
System.out.println(l.getBook() == -6);
l.moreBook(2);
System.out.println(l.getBook() == -8);
l.moreBook(-9);
System.out.println(l.getBook() == 1);
}
}

View File

@@ -0,0 +1,122 @@
/*
* Author: CHEN Yongyuan (Walter) 1930006025 from OOP(1007)
* Date: 2022-04-25
* Description: This is the Library class.
*/
import java.util.ArrayList;
public class Library {
private String name;
private ArrayList<IUser> users;
private ArrayList<ModelListener> listeners;
/**
* Constructor.
*
* @param name
*/
public Library(String name) {
this.name = name;
// init array list
this.users = new ArrayList<IUser>();
this.listeners = new ArrayList<ModelListener>();
}
// GUI Related
public void addListener(ModelListener listener) {
listeners.add(listener);
}
// GUI Related
private void notifyListeners() {
for (ModelListener listener : listeners) {
listener.update();
}
}
/**
* Add the user to the array list.
*
* @param user The user to be added
*/
public void addUser(IUser user) {
users.add(user);
notifyListeners();
}
/**
* The total number of bookds borrowed by all users.
*
* @return the number of books.
*/
public int totalBorrowedBooks() {
int total = 0;
for (IUser user : users) {
total += user.getBook();
}
return total;
}
/**
* Get the number of books borrowed by this user.
*
* @param name the name of the query user
* @return the number of books
* @throws UnknownUserException if user not found
*/
public int getBook(String name) throws UnknownUserException {
for (IUser user : users) {
if (user.getName().equals(name)) {
return user.getBook();
}
}
// user not found
throw new UnknownUserException("User " + name + " unknown.");
}
/**
* Change the number of books currently borrowed by that user.
*
* @param name the user's name
* @param number the number of books
* @throws UnknownUserException user not found
* @throws NotALenderException can not lend book
*/
public void moreBook(String name, int number) throws UnknownUserException, NotALenderException {
for (IUser user : users) {
if (user.getName().equals(name)) {
user.moreBook(number);
notifyListeners();
return;
}
}
// user not found
throw new UnknownUserException("User " + name + " unknown.");
}
/**
* Test.
*/
public static void testLibrary() {
Library li = new Library("UIC Library");
System.out.println(li.totalBorrowedBooks() == 0);
li.addUser(new Lender("L1", 10));
try {
System.out.println(li.getBook("L1") == -10);
System.out.println(li.totalBorrowedBooks() == -10);
li.addUser(new Borrower("B1", 20));
System.out.println(li.getBook("L1") == -10);
System.out.println(li.getBook("B1") == 20);
System.out.println(li.totalBorrowedBooks() == 10);
li.getBook("B2");
} catch (UnknownUserException ex) {
System.out.println(ex.getMessage().equals("User B2 unknown."));
} catch (NotALenderException ex) {
// This should never happen!
System.out.println(false);
}
// More test cases are needed
}
}

View File

@@ -0,0 +1,3 @@
public interface ModelListener {
public void update();
}

View File

@@ -0,0 +1,5 @@
public class NotALenderException extends Exception {
public NotALenderException(String message) {
super(message);
}
}

View File

@@ -0,0 +1,8 @@
public class Test {
public static void main(String[] args) {
User.testUser();
Lender.testLender();
Borrower.testBorrower();
Library.testLibrary();
}
}

View File

@@ -0,0 +1,5 @@
public class UnknownUserException extends Exception {
public UnknownUserException(String message) {
super(message);
}
}

View File

@@ -0,0 +1,69 @@
/*
* Author: CHEN Yongyuan (Walter) 1930006025 from OOP(1007)
* Date: 2022-04-25
* Description: This is the User class.
*/
public abstract class User implements IUser {
/**
* The user's name.
*/
private String name;
/**
* The number of books borrowed by the user.
*/
private int book;
/**
* Constructor.
*
* @param name The user's name.
* @param book The number of books borrowed by the user.
*/
public User(String name, int book) {
this.name = name;
this.book = book;
}
/**
* Getter of the user's name.
*
* @return The user's name.
*/
public String getName() {
return name;
}
/**
* Getter of the number of books borrowed by the user.
*
* @return The number of books borrowed by the user.
*/
public int getBook() {
return book;
}
/**
* Change the number of books borrowed by the user.
*
* @param book The number of books borrowed by the user.
*/
protected void setBook(int book) {
this.book = book;
}
/**
* Increase the number of books borrowed by the user.
*
* @param book The number of books borrowed by the user.
*/
public abstract void moreBook(int number) throws NotALenderException;
/**
* Test.
*/
public static void testUser() {
// abstract class not testing
}
}

View File

@@ -0,0 +1,18 @@
import javax.swing.JFrame;
public abstract class View<T extends Controller> extends JFrame implements ModelListener {
protected Library m;
protected T c;
public View(Library m, T c) {
this.m = m;
this.c = c;
m.addListener(this);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
}
public abstract void update();
}

View File

@@ -0,0 +1,29 @@
/*
* Author: CHEN Yongyuan (Walter) 1930006025 from OOP(1007)
* Date: 2022-04-25
*/
import javax.swing.JLabel;
public class ViewSimple extends View<ControllerSimple> {
private JLabel label;
public ViewSimple(Library m, ControllerSimple c) {
super(m, c);
// window
this.setTitle("View Simple");
this.setSize(300, 200);
// conponent
label = new JLabel("Total number of borrowed books: " + m.totalBorrowedBooks());
add(label);
// final
this.setVisible(true);
}
public void update() {
label.setText("Total number of borrowed books: " + m.totalBorrowedBooks());
}
}