digraph G { fontname = "Bitstream Vera Sans" fontsize = 8 node [ fontname = "Bitstream Vera Sans" fontsize = 8 shape = "record" ] edge [ fontname = "Bitstream Vera Sans" fontsize = 8 ] rankdir = BT // Interfaces IReservation [ label = "{<>\nIReservation|+ ReservationType()\l+ checkValid()\l+ calculatePrice()\l+ getReservation_number()\l+ getAccountNumber()\l+ getPhysical_address()\l}" style=filled, fillcolor=lightblue ]; // Abstract Classes Reservation [ label = "{<>\nReservation|- type: char\l- reservation_number: String\l- physical_address: Address\l- mailing_address: Address\l- reservation_start_date: ZonedDateTime\l- reservation_end_date: ZonedDateTime\l- reservation_status: ReservationStatusEnum\l- kitchen: KitchenTypeEnum\l- numberOfBeds: Integer\l- ...\l- price: Float\l- accountNumber: String\l|+ getReservation_number()\l+ setReservation_number()\l+ ...\l+ Write()\l+ Change()\l+ update()\l# ReservationType()\l}" style=filled, fillcolor=lightgrey ]; // Concrete Classes HotelReservation [ label = "{HotelReservation|+ calculatePrice()\l+ checkValid()\l+ ReservationType()\l}" ]; HouseReservation [ label = "{HouseReservation|+ calculatePrice()\l+ checkValid()\l+ ReservationType()\l}" ]; CabinReservation [ label = "{CabinReservation|+ calculatePrice()\l+ checkValid()\l+ ReservationType()\l}" ]; Account [ label = "{Account|- account_number: String\l- phone_number: String\l- mailing_address: Address\l- email_address: EmailAddress\l- reservations: AccountReservationList\l|+ add(Reservation)\l+ Write(Account)\l+ findReservation(String)\l+ ...\l}" ]; AccountList [ label = "{AccountList|+ add(Account)\l+ save(Account)\l+ find(String)\l+ getListOfReservations()\l}" ]; AccountReservationList [ label = "{AccountReservationList|+ add(IReservation)\l+ find(String)\l+ update(...)\l}" ]; AccomodationManager [ label = "{AccomodationManager|- accounts: AccountList\l|+ loadAll()\l+ retrieveAccount(String)\l+ AddAccount(Account)\l+ addReservation(Account, Reservation)\l+ findReservation(String)\l}" ]; DataRepository [ label = "{<>\nDataRepository|- instance: DataRepository\l- directoryPath: String\l|+ getInstance()\l+ setDataStoreRoot(String)\l+ getPath()\l+ Reservation(String)\l+ WalkFileSystemTree(...)\l+ LoadAccount(Path)\l}" ]; TestReservations [ label = "{TestReservations|+ main(String[])\l}" ]; // Data/Value Objects Address [ label = "{Address|- street: String\l- city: String\l- state: String\l- zip: String\l}" shape=box, style=filled, fillcolor=beige ]; EmailAddress [ label = "{EmailAddress|- email: String\l}" shape=box, style=filled, fillcolor=beige ]; // Enums KitchenTypeEnum [ label = "{<>\nKitchenTypeEnum|None\l|Kitchenette\l|FullKitchen\l}" shape=box, style=filled, fillcolor=lightyellow ]; ReservationStatusEnum [ label = "{<>\nReservationStatusEnum|Draft\l|Completed\l|Canceled\l}" shape=box, style=filled, fillcolor=lightyellow ]; // Relationships // Inheritance edge [arrowhead=empty, style=solid]; HotelReservation -> Reservation; HouseReservation -> Reservation; CabinReservation -> Reservation; AccountList -> "java.util.ArrayList" [style=dashed, label="extends"]; AccountReservationList -> "java.util.ArrayList" [style=dashed, label="extends"]; // Implementation edge [arrowhead=empty, style=dashed]; Reservation -> IReservation; // Composition edge [arrowhead=diamond, style=solid]; AccomodationManager -> AccountList [label="1..1 accounts"]; Account -> AccountReservationList [label="1..1 reservations"]; Account -> Address [label="1..1 mailing_address"]; Account -> EmailAddress [label="1..1 email_address"]; // Aggregation edge [arrowhead=odiamond, style=solid]; AccountReservationList -> IReservation [label="0..*"]; AccountList -> Account [label="0..*"]; Reservation -> Address [label="0..2\n(physical, mailing)"]; // Dependency edge [arrowhead=vee, style=dashed]; AccomodationManager -> DataRepository [label="uses"]; AccomodationManager -> Account; TestReservations -> AccomodationManager [label="uses"]; TestReservations -> HotelReservation [label="creates"]; TestReservations -> HouseReservation [label="creates"]; TestReservations -> CabinReservation [label="creates"]; DataRepository -> AccomodationManager [label="uses"]; DataRepository -> Account [label="creates"]; DataRepository -> HotelReservation [label="creates"]; DataRepository -> HouseReservation [label="creates"]; DataRepository -> CabinReservation [label="creates"]; Account -> DataRepository [label="uses"]; Reservation -> DataRepository [label="uses"]; Reservation -> KitchenTypeEnum [label="uses"]; Reservation -> ReservationStatusEnum [label="uses"]; }