Worked alongside a team of 3 to build a desktop application that allows users to purchase books, and enables administrators to update and track book inventory while also having access to a customer database where they can view and modify customer details.
Demo Showcase

The Bookstore App allows users to purchase books and enables administrators to manage book inventory and customer data. It was built using Java and JavaFX for the GUI, leveraging OOP to create book and customer objects. The state design pattern was applied to manage customer member status changes.
Object-Oriented Programming (OOP) Example
Here's an example of how OOP is used in the Bookstore App to represent a Book object:
public class Book {
private String name;
private double price;
private String author;
public Book(String name, double price, String author) {
this.name = name;
this.price = price;
this.author = author;
}
// Getters and setters
// ...
@Override
public String toString() {
return name + ", " + price + ", " + author;
}
}
This Book class encapsulates the properties and behaviors of a book, demonstrating key OOP principles such as encapsulation and abstraction.
State Design Pattern Implementation
The Bookstore App uses the state design pattern to manage customer status changes. Here's a simplified example of how it might be implemented:
public interface CustomerStatus {
void updatePoints(Customer customer, double purchaseAmount);
}
public class SilverStatus implements CustomerStatus {
@Override
public void updatePoints(Customer customer, double purchaseAmount) {
customer.setPoints(customer.getPoints() + (int)(purchaseAmount * 1.0));
if (customer.getPoints() > 1000) {
customer.setStatus(new GoldStatus());
}
}
}
public class GoldStatus implements CustomerStatus {
@Override
public void updatePoints(Customer customer, double purchaseAmount) {
customer.setPoints(customer.getPoints() + (int)(purchaseAmount * 1.5));
}
}
public class Customer {
private CustomerStatus status;
private int points;
// Constructor, getters, and setters
// ...
public void makePurchase(double amount) {
status.updatePoints(this, amount);
}
}
This implementation allows the customer's status to change dynamically based on their points, demonstrating the flexibility and power of the state design pattern in managing complex behaviors.
By using static typing, OOP principles, and design patterns, the Bookstore App achieves a high level of code organization, maintainability, and extensibility. This real-world example showcases how these concepts can be applied to create robust and scalable software solutions.