Facade design pattern simplifies the interface to a complex system. In Facade Pattern, the facade class does all the required tasks instead of allowing the client app to them.
Imagine walking to a self service restaurant, McDonalds where diner need to select food from UI, Pay the amount and wait in counter, check the screen for token no, collect the food and find a table before eating. Now in a Dine-In restaurant instead of diner doing all these steps we make the waiter do all these and get the food. Waiter is the Facade and Diner is the Client
Why to use Facade Pattern?
Classes in all design patterns are just normal classes. What is important is how they are structured and how they work together to solve a given problem in the best possible way.
The Facade design pattern simplifies the interface to a complex system; because it is usually composed of all the classes which make up the subsystems of the complex system.
A Facade shields the user from the complex details of the system and provides them with a simplified view of it which is easy to use. It also decouples the code that uses the system from the details of the subsystems, making it easier to modify the system later.
When to use Facade Pattern?
To provide higher-level interface that makes the subsystem easier to use.
How to implement Facade Pattern?
Instead of exposing the complex code logic we wrap the complex code in a separate class facade class and call the method of Facade Class.
Code Implementation
- OnlineApp has many code logic which includes Creating Order, Inventory Updation, Payment Tracking, Seller Buyer Notification and Shipment
- Instead of writing all the code in onlineApp we can move the code to FacadeClass(OrderFacade.java) and call the method of OrderFacade
Code without Facade Pattern
OnlineApp.java
public class OnlineApp { public static void main(String[] args) { System.out.println("Step 1: Order Created"); Order objOrder = new Order(); objOrder.placeOrder(); System.out.println("------------------------"); System.out.println("Step 2: Inventory Updated"); Inventory objInventory = new Inventory(); objInventory.checkInventory("Iphone 13"); System.out.println("------------------------"); System.out.println("Step 3: Payment Succesful"); Payment objPayment = new Payment(); objPayment.checkPaymentStatus("873901"); System.out.println("------------------------"); System.out.println("Step 4: Seller and Buyer Notified"); Notifications objNotification = new Notifications(); objNotification.notifyBuyer("873901"); objNotification.notifySeller("873901"); System.out.println("------------------------"); System.out.println("Step 5: Shipment Done"); Shipment objShipment = new Shipment(); objShipment.shipProduct("Road Name, Location"); System.out.println("------------------------"); } }
Code with Facade Pattern
OrderFacade.java
public class OrderFacade { Order objOrder = new Order(); Inventory objInventory = new Inventory(); Payment objPayment = new Payment(); Notifications objNotification = new Notifications(); Shipment objShipment = new Shipment(); public void placeOrder(String orderId) { System.out.println("Step 1: Order Created"); objOrder.placeOrder(); System.out.println("------------------------"); System.out.println("Step 2: Inventory Updated"); objInventory.checkInventory("Iphone 13"); System.out.println("------------------------"); System.out.println("Step 3: Payment Succesful"); objPayment.checkPaymentStatus(orderId); System.out.println("------------------------"); System.out.println("Step 4: Seller and Buyer Notified"); objNotification.notifyBuyer(orderId); objNotification.notifySeller(orderId); System.out.println("------------------------"); System.out.println("Step 5: Shipment Done"); objShipment.shipProduct("Road Name, Location"); System.out.println("------------------------"); } }
OnlineApp.java
public class OnlineApp { public static void main(String[] args) { OrderFacade objOrderFacade = new OrderFacade(); objOrderFacade.placeOrder("873901"); } }
Output
Step 1: Order Created Display Cart Order ------------------------ Step 2: Inventory Updated ------------------------ Step 3: Payment Succesful ------------------------ Step 4: Seller and Buyer Notified Order placed by Buyer Order Received by Seller ------------------------ Step 5: Shipment Done Shipping toRoad Name, Location ------------------------