Design an online book reader system - GeeksforGeeks

29 Jul, 2021
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 implementthe class such that it stores information about all the books deals 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. User2. Book3. Library4. UserManager5. Display6. OnlineReaderSystem
Full code is given below :
Java
C#
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();    }}
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 Applicationpublic 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
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 the working professionals, to get a much-needed advantage over others during tech interviews.
And that’s why, GeeksforGeeks is providing you with an in-depth interview-centric System Design – Live Course that will help you prepare for the questions related to System Designs for Google, Amazon, Adobe, Uber, and other product-based companies.
29AjayKumar
Object-Oriented-Design
Design Pattern
GBlog
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
SDE SHEET - A Complete Guide for SDE Preparation
Factory method design pattern in Java
Builder Design Pattern
MVC Design Pattern
Java Singleton Design Pattern Practices with Examples
Roadmap to Become a Web Developer in 2022
Must Do Coding Questions for Companies like Amazon, Microsoft, Adobe, ...
Socket Programming in C/C++
DSA Sheet by Love Babbar
GET and POST requests using Python