Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions src/main/java/facade/App.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package facade;

import facade.dto.TripDetailsDto;
import facade.facade.TravelFacade;

import java.time.LocalDate;

public class App {
public static void main(String[] args) {
TripDetailsDto trip = new TripDetailsDto.Builder()
.customerName("Alice")
.origin("Beijing")
.destination("Shanghai")
.departureDate(LocalDate.of(2025, 6, 7))
.returnDate(LocalDate.of(2025, 6, 8))
.build();

TravelFacade facade = new TravelFacade.Builder()
.trip(trip)
.build();

facade.bookAll();
}
}
57 changes: 57 additions & 0 deletions src/main/java/facade/dto/TripDetailsDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package facade.dto;

import lombok.Getter;

import java.time.LocalDate;

@Getter
public class TripDetailsDto {
private final String passengerName;
private final LocalDate departureDate;
private final LocalDate returnDate;
private final String origin;
private final String destination;

private TripDetailsDto(Builder builder) {
this.passengerName = builder.customerName;
this.departureDate = builder.departureDate;
this.returnDate = builder.returnDate;
this.origin = builder.origin;
this.destination = builder.destination;
}

public static class Builder {
private String customerName;
private LocalDate departureDate;
private LocalDate returnDate;
private String origin;
private String destination;

public Builder customerName(String name) {
this.customerName = name;
return this;
}
public Builder departureDate(LocalDate date) {
this.departureDate = date;
return this;
}
public Builder returnDate(LocalDate date) {
this.returnDate = date;
return this;
}
public Builder origin(String origin) {
this.origin = origin;
return this;
}
public Builder destination(String dest) {
this.destination = dest;
return this;
}
public TripDetailsDto build() {
if (departureDate.isAfter(returnDate)) {
throw new IllegalArgumentException("Departure must be before return date");
}
return new TripDetailsDto(this);
}
}
}
75 changes: 75 additions & 0 deletions src/main/java/facade/facade/TravelFacade.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package facade.facade;

import facade.dto.TripDetailsDto;
import facade.service.FlightBookingService;
import facade.service.HotelBookingService;
import facade.service.PaymentService;
import facade.service.TaxiBookingService;
import facade.service.impl.FlightBookingServiceImpl;
import facade.service.impl.HotelBookingServiceImpl;
import facade.service.impl.PaymentServiceImpl;
import facade.service.impl.TaxiBookingServiceImpl;

public class TravelFacade {
private final FlightBookingService flightService;
private final HotelBookingService hotelService;
private final TaxiBookingService taxiService;
private final PaymentService paymentService;
private final TripDetailsDto trip;
private double totalCost;

private TravelFacade(Builder builder) {
this.flightService = new FlightBookingServiceImpl();
this.hotelService = new HotelBookingServiceImpl();
this.taxiService = new TaxiBookingServiceImpl();
this.paymentService = new PaymentServiceImpl();
this.trip = builder.trip;
}

public static class Builder {
private TripDetailsDto trip;

public Builder trip(TripDetailsDto trip) {
this.trip = trip;
return this;
}

public TravelFacade build() {
if (trip == null) {
throw new IllegalStateException("TripDetails must be provided");
}
return new TravelFacade(this);
}
}

public void bookAll() {
System.out.println("Start the itinerary booking process...");
// 1. Flight
String flightConf = flightService.bookFlight(
trip.getPassengerName(), trip.getOrigin(), trip.getDestination(), trip.getDepartureDate());
totalCost += 500.0;

// 2. Hotel
String hotelConf = hotelService.bookHotel(
trip.getPassengerName(), trip.getDestination(), trip.getDepartureDate(), trip.getReturnDate());
totalCost += 300.0;

// 3. Taxi
String taxiConf = taxiService.bookCar(
trip.getPassengerName(), trip.getDestination(), trip.getDepartureDate(), trip.getReturnDate());
totalCost += 200.0;

// 4. Pay
boolean paid = paymentService.processPayment(trip.getPassengerName(), totalCost);
if (!paid) {
throw new RuntimeException("Payment failed, booking cancelled");
}

System.out.println("Booking completed! The following is the confirmation information:");
System.out.println("Flight info: " + flightConf);
System.out.println("Hotel info: " + hotelConf);
System.out.println("Taxi info: " + taxiConf);
System.out.printf("Total cost: %.2f%n", totalCost);
}

}
7 changes: 7 additions & 0 deletions src/main/java/facade/service/FlightBookingService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package facade.service;

import java.time.LocalDate;

public interface FlightBookingService {
String bookFlight(String passenger, String from, String to, LocalDate date);
}
7 changes: 7 additions & 0 deletions src/main/java/facade/service/HotelBookingService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package facade.service;

import java.time.LocalDate;

public interface HotelBookingService {
String bookHotel(String passenger, String city, LocalDate from, LocalDate to);
}
5 changes: 5 additions & 0 deletions src/main/java/facade/service/PaymentService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package facade.service;

public interface PaymentService {
boolean processPayment(String user, double amount);
}
7 changes: 7 additions & 0 deletions src/main/java/facade/service/TaxiBookingService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package facade.service;

import java.time.LocalDate;

public interface TaxiBookingService {
String bookCar(String passenger, String city, LocalDate from, LocalDate to);
}
15 changes: 15 additions & 0 deletions src/main/java/facade/service/impl/FlightBookingServiceImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package facade.service.impl;

import facade.service.FlightBookingService;

import java.time.LocalDate;
import java.util.UUID;

public class FlightBookingServiceImpl implements FlightBookingService {
@Override
public String bookFlight(String passenger, String from, String to, LocalDate date) {
String flightInfo = STR."FLIGHT-\{UUID.randomUUID()}";
System.out.printf("[%s] booking %s->%s flight for %s, date: %s%n", flightInfo, from, to, passenger, date);
return flightInfo;
}
}
16 changes: 16 additions & 0 deletions src/main/java/facade/service/impl/HotelBookingServiceImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package facade.service.impl;

import facade.service.HotelBookingService;

import java.time.LocalDate;
import java.util.UUID;

public class HotelBookingServiceImpl implements HotelBookingService {
@Override
public String bookHotel(String passenger, String city, LocalDate from, LocalDate to) {
String hotelInfo = STR."HOTEL-\{UUID.randomUUID()}";
System.out.printf("[%s] booking hotel in %s for %s, checkin: %s, checkout: %s%n",
hotelInfo, city, passenger, from, to);
return hotelInfo;
}
}
11 changes: 11 additions & 0 deletions src/main/java/facade/service/impl/PaymentServiceImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package facade.service.impl;

import facade.service.PaymentService;

public class PaymentServiceImpl implements PaymentService {
@Override
public boolean processPayment(String user, double amount) {
System.out.printf("Processing payment for %s, amount: %.2f%n", user, amount);
return true;
}
}
15 changes: 15 additions & 0 deletions src/main/java/facade/service/impl/TaxiBookingServiceImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package facade.service.impl;

import facade.service.TaxiBookingService;

import java.time.LocalDate;
import java.util.UUID;

public class TaxiBookingServiceImpl implements TaxiBookingService {
@Override
public String bookCar(String passenger, String city, LocalDate from, LocalDate to) {
String taxiInfo = STR."CAR-\{UUID.randomUUID()}";
System.out.printf("[%s] booking taxi for %s in %s, from: %s, to: %s%n", taxiInfo, passenger, city, from, to);
return taxiInfo;
}
}