Open In App

Design an online book reader system

Improve
Improve
Like Article
Like
Save
Share
Report

Design an online book reader system (Object-Oriented Design). 

Asked In: Amazon, Microsoft, and many more interviews 

Solution: Let’s assume we want to design a basic online reading system that provides the following functionality: • Searching the database of books and reading a book. • User membership creation and extension. • Only one active user at a time and only one active book by this user The class OnlineReaderSystem represents the body of our program. We could implement the class such that it stores information about all the books dealing with user management and refreshes the display, but that would make this class rather hefty. Instead, we’ve chosen to tear off these components into Library, UserManager, and Display classes. 

The classes:

  1. User
  2. Book
  3. Library
  4. UserManager
  5. Display
  6. OnlineReaderSystem 

The full code is given below : 

Java




import java.util.HashMap;
 
/*
* This class represents the system
*/
 
class OnlineReaderSystem {
    private Library library;
    private UserManager userManager;
    private Display display;
    private Book activeBook;
    private User activeUser;
 
    public OnlineReaderSystem()
    {
        userManager = new UserManager();
        library = new Library();
        display = new Display();
    }
 
    public Library getLibrary()
    {
        return library;
    }
 
    public UserManager getUserManager()
    {
        return userManager;
    }
 
    public Display getDisplay()
    {
        return display;
    }
 
    public Book getActiveBook()
    {
        return activeBook;
    }
 
    public void setActiveBook(Book book)
    {
        activeBook = book;
        display.displayBook(book);
    }
 
    public User getActiveUser()
    {
        return activeUser;
    }
 
    public void setActiveUser(User user)
    {
        activeUser = user;
        display.displayUser(user);
    }
}
 
/*
* We then implement separate classes to handle the user
* manager, the library, and the display components
*/
 
/*
* This class represents the Library which is responsible
* for storing and searching the books.
*/
class Library {
    private HashMap<Integer, Book> books;
 
    public Library()
    {
        books = new HashMap<Integer, Book>();
    }
 
    public Boolean addBook(int id, String details, String title)
    {
        if (books.containsKey(id)) {
            return false;
        }
        Book book = new Book(id, details, title);
        books.put(id, book);
        return true;
    }
 
    public Boolean addBook(Book book)
    {
        if (!books.containsKey(book.getId())) {
            return false;
        }
 
        books.put(book.getId(), book);
        return true;
    }
 
    public boolean remove(Book b)
    {
        return remove(b.getId());
    }
 
    public boolean remove(int id)
    {
        if (!books.containsKey(id)) {
            return false;
        }
        books.remove(id);
        return true;
    }
 
    public Book find(int id)
    {
        return books.get(id);
    }
}
 
/*
* This class represents the UserManager which is responsible
* for managing the users, their membership etc.
*/
 
class UserManager {
    private HashMap<Integer, User> users;
 
    public UserManager()
    {
        users = new HashMap<Integer, User>();
    }
    public Boolean addUser(int id, String details, String name)
    {
        if (users.containsKey(id)) {
            return false;
        }
        User user = new User(id, details, name);
        users.put(id, user);
        return true;
    }
 
    public Boolean addUser(User user)
    {
        if (users.containsKey(user.getId())) {
            return false;
        }
 
        users.put(user.getId(), user);
        return true;
    }
 
    public boolean remove(User u)
    {
        return remove(u.getId());
    }
 
    public boolean remove(int id)
    {
        if (users.containsKey(id)) {
            return false;
        }
        users.remove(id);
        return true;
    }
 
    public User find(int id)
    {
        return users.get(id);
    }
}
 
/*
* This class represents the Display, which is responsible
* for displaying the book, it's pages and contents. It also
* shows the current user. * It provides the method
* turnPageForward, turnPageBackward, refreshPage etc.
*/
 
class Display {
    private Book activeBook;
    private User activeUser;
    private int pageNumber = 0;
 
    public void displayUser(User user)
    {
        activeUser = user;
        refreshUsername();
    }
 
    public void displayBook(Book book)
    {
        pageNumber = 0;
        activeBook = book;
 
        refreshTitle();
        refreshDetails();
        refreshPage();
    }
 
    public void turnPageForward()
    {
        pageNumber++;
        System.out.println("Turning forward to page no " +
                   pageNumber + " of book having title " +
                                     activeBook.getTitle());
        refreshPage();
    }
 
    public void turnPageBackward()
    {
        pageNumber--;
        System.out.println("Turning backward to page no " +
                    pageNumber + " of book having title " +
                                    activeBook.getTitle());
        refreshPage();
    }
 
    public void refreshUsername()
    {
        /* updates username display */
        System.out.println("User name " + activeUser.getName() +
                                             " is refreshed");
    }
 
    public void refreshTitle()
    {
        /* updates title display */
        System.out.println("Title of the book " +
                        activeBook.getTitle() + " refreshed");
    }
 
    public void refreshDetails()
    {
        /* updates details display */
        System.out.println("Details of the book " +
                        activeBook.getTitle() + " refreshed");
    }
 
    public void refreshPage()
    {
        /* updated page display */
        System.out.println("Page no " + pageNumber + " refreshed");
    }
}
 
/*
* The classes for User and Book simply hold data and
* provide little functionality.
* This class represents the Book which is a simple POJO
*/
 
class Book {
    private int bookId;
    private String details;
    private String title;
 
    public Book(int id, String details, String title)
    {
        bookId = id;
        this.details = details;
        this.title = title;
    }
 
    public int getId()
    {
        return bookId;
    }
 
    public void setId(int id)
    {
        bookId = id;
    }
 
    public String getDetails()
    {
        return details;
    }
 
    public void setDetails(String details)
    {
        this.details = details;
    }
 
    public String getTitle()
    {
        return title;
    }
 
    public void setTitle(String title)
    {
        this.title = title;
    }
}
 
/*
* This class represents the User which is a simple POJO
*/
 
class User {
    private int userId;
    private String name;
    private String details;
 
    public void renewMembership()
    {
    }
 
    public User(int id, String details, String name)
    {
        this.userId = id;
        this.details = details;
        this.name = name;
    }
 
    public int getId()
    {
        return userId;
    }
 
    public void setId(int id)
    {
        userId = id;
    }
 
    public String getDetails()
    {
        return details;
    }
 
    public void setDetails(String details)
    {
        this.details = details;
    }
 
    public String getName()
    {
        return name;
    }
 
    public void setName(String name)
    {
        this.name = name;
    }
}
 
// This class is used to test the Application
 
public class AppTest {
 
    public static void main(String[] args)
    {
 
        OnlineReaderSystem onlineReaderSystem = new OnlineReaderSystem();
 
        Book dsBook = new Book(1, "It contains Data Structures", "Ds");
        Book algoBook = new Book(2, "It contains Algorithms", "Algo");
 
        onlineReaderSystem.getLibrary().addBook(dsBook);
        onlineReaderSystem.getLibrary().addBook(algoBook);
 
        User user1 = new User(1, " ", "Ram");
        User user2 = new User(2, " ", "Gopal");
 
        onlineReaderSystem.getUserManager().addUser(user1);
        onlineReaderSystem.getUserManager().addUser(user2);
 
        onlineReaderSystem.setActiveBook(algoBook);
        onlineReaderSystem.setActiveUser(user1);
 
        onlineReaderSystem.getDisplay().turnPageForward();
        onlineReaderSystem.getDisplay().turnPageForward();
        onlineReaderSystem.getDisplay().turnPageBackward();
    }
}


C#




using System;
using System.Collections.Generic;
 
/*
* This class represents the system
*/
 
class OnlineReaderSystem
{
    private Library library;
    private UserManager userManager;
    private Display display;
    private Book activeBook;
    private User activeUser;
 
    public OnlineReaderSystem()
    {
        userManager = new UserManager();
        library = new Library();
        display = new Display();
    }
 
    public Library getLibrary()
    {
        return library;
    }
 
    public UserManager getUserManager()
    {
        return userManager;
    }
 
    public Display getDisplay()
    {
        return display;
    }
 
    public Book getActiveBook()
    {
        return activeBook;
    }
 
    public void setActiveBook(Book book)
    {
        activeBook = book;
        display.displayBook(book);
    }
 
    public User getActiveUser()
    {
        return activeUser;
    }
 
    public void setActiveUser(User user)
    {
        activeUser = user;
        display.displayUser(user);
    }
}
 
/*
* We then implement separate classes to handle the user
* manager, the library, and the display components
*/
 
/*
* This class represents the Library which is responsible
* for storing and searching the books.
*/
class Library
{
    private Dictionary<int, Book> books;
 
    public Library()
    {
        books = new Dictionary<int, Book>();
    }
 
    public Boolean addBook(int id, String details,
                                   String title)
    {
        if (books.ContainsKey(id))
        {
            return false;
        }
        Book book = new Book(id, details, title);
        books.Add(id, book);
        return true;
    }
 
    public Boolean addBook(Book book)
    {
        if (books.ContainsKey(book.getId()))
        {
            return false;
        }
 
        books.Add(book.getId(), book);
        return true;
    }
 
    public bool remove(Book b)
    {
        return remove(b.getId());
    }
 
    public bool remove(int id)
    {
        if (!books.ContainsKey(id))
        {
            return false;
        }
        books.Remove(id);
        return true;
    }
 
    public Book find(int id)
    {
        return books[id];
    }
}
 
/*
* This class represents the UserManager 
* which is responsible for managing the users,
* their membership etc.
*/
class UserManager
{
    private Dictionary<int, User> users;
 
    public UserManager()
    {
        users = new Dictionary<int, User>();
    }
    public Boolean addUser(int id, String details,
                                   String name)
    {
        if (!users.ContainsKey(id))
        {
            return false;
        }
        User user = new User(id, details, name);
        users.Add(id, user);
        return true;
    }
 
    public Boolean addUser(User user)
    {
        if (users.ContainsKey(user.getId()))
        {
            return false;
        }
 
        users.Add(user.getId(), user);
        return true;
    }
 
    public bool remove(User u)
    {
        return remove(u.getId());
    }
 
    public bool remove(int id)
    {
        if (users.ContainsKey(id))
        {
            return false;
        }
        users.Remove(id);
        return true;
    }
 
    public User find(int id)
    {
        return users[id];
    }
}
 
/*
* This class represents the Display, which is responsible
* for displaying the book, it's pages and contents. 
* It also shows the current user. * It provides the method
* turnPageForward, turnPageBackward, refreshPage etc.
*/
class Display
{
    private Book activeBook;
    private User activeUser;
    private int pageNumber = 0;
 
    public void displayUser(User user)
    {
        activeUser = user;
        refreshUsername();
    }
 
    public void displayBook(Book book)
    {
        pageNumber = 0;
        activeBook = book;
 
        refreshTitle();
        refreshDetails();
        refreshPage();
    }
 
    public void turnPageForward()
    {
        pageNumber++;
        Console.WriteLine("Turning forward to page no " +
                  pageNumber + " of book having title " +
                                  activeBook.getTitle());
        refreshPage();
    }
 
    public void turnPageBackward()
    {
        pageNumber--;
        Console.WriteLine("Turning backward to page no " +
                   pageNumber + " of book having title " +
                                   activeBook.getTitle());
        refreshPage();
    }
 
    public void refreshUsername()
    {
        /* updates username display */
        Console.WriteLine("User name " +
                  activeUser.getName() +
                       " is refreshed");
    }
 
    public void refreshTitle()
    {
        /* updates title display */
        Console.WriteLine("Title of the book " +
                         activeBook.getTitle() +
                                  " refreshed");
    }
 
    public void refreshDetails()
    {
        /* updates details display */
        Console.WriteLine("Details of the book " +
                           activeBook.getTitle() +
                                    " refreshed");
    }
 
    public void refreshPage()
    {
        /* updated page display */
        Console.WriteLine("Page no " + pageNumber +
                                     " refreshed");
    }
}
 
/*
* The classes for User and Book simply hold data 
* and provide little functionality.
* This class represents the Book which is
* a simple POJO
*/
class Book
{
    private int bookId;
    private String details;
    private String title;
 
    public Book(int id, String details,
                        String title)
    {
        bookId = id;
        this.details = details;
        this.title = title;
    }
 
    public int getId()
    {
        return bookId;
    }
 
    public void setId(int id)
    {
        bookId = id;
    }
 
    public String getDetails()
    {
        return details;
    }
 
    public void setDetails(String details)
    {
        this.details = details;
    }
 
    public String getTitle()
    {
        return title;
    }
 
    public void setTitle(String title)
    {
        this.title = title;
    }
}
 
/*
* This class represents the User
* which is a simple POJO
*/
class User
{
    private int userId;
    private String name;
    private String details;
 
    public void renewMembership()
    {
    }
 
    public User(int id, String details,
                        String name)
    {
        this.userId = id;
        this.details = details;
        this.name = name;
    }
 
    public int getId()
    {
        return userId;
    }
 
    public void setId(int id)
    {
        userId = id;
    }
 
    public String getDetails()
    {
        return details;
    }
 
    public void setDetails(String details)
    {
        this.details = details;
    }
 
    public String getName()
    {
        return name;
    }
 
    public void setName(String name)
    {
        this.name = name;
    }
}
 
// This class is used to test the Application
public class AppTest
{
    public static void Main(String[] args)
    {
 
        OnlineReaderSystem
              onlineReaderSystem = new OnlineReaderSystem();
 
        Book dsBook = new Book(1, "It contains Data Structures", "Ds");
        Book algoBook = new Book(2, "It contains Algorithms", "Algo");
 
        onlineReaderSystem.getLibrary().addBook(dsBook);
        onlineReaderSystem.getLibrary().addBook(algoBook);
 
        User user1 = new User(1, " ", "Ram");
        User user2 = new User(2, " ", "Gopal");
 
        onlineReaderSystem.getUserManager().addUser(user1);
        onlineReaderSystem.getUserManager().addUser(user2);
 
        onlineReaderSystem.setActiveBook(algoBook);
        onlineReaderSystem.setActiveUser(user1);
 
        onlineReaderSystem.getDisplay().turnPageForward();
        onlineReaderSystem.getDisplay().turnPageForward();
        onlineReaderSystem.getDisplay().turnPageBackward();
    }
}
 
// This code is contributed by 29AjayKumar


Mastering System Design Course by Geeksforgeeks

Want to get a Software Developer/Engineer job at a leading tech company? or Want to make a smooth transition from SDE I to SDE II or Senior Developer profiles? If yes, then you’re required to dive deep into the System Design world! A decent command over System Design concepts is very much essential, especially for working professionals, to get a much-needed advantage over others during tech interviews. 

System-Design-Course-By-GeeksforGeeks

And that’s why, GeeksforGeeks is providing you with an in-depth interview-centric Mastering System Design Course that will help you prepare for the questions related to System Designs for Google, Amazon, Adobe, Uber, and other product-based companies.



Last Updated : 04 Aug, 2023
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads