package com.zq.designpattern.facade;
/**
* Created by zhengshouzi on 2015/10/29.
*/
//服務員
class Waiter{
//服務員坑定知道酒店內部有哪些服務
private KitchenService kitchenService;
private BookRoomService bookRoomService;
private DrinkService drinkService;
private PayService payService;
public Waiter() {
this.kitchenService = new KitchenService();
this.bookRoomService = new BookRoomService();
this.drinkService = new DrinkService();
this.payService = new PayService();
}
//這些都是給服務員下的命令,至於具體怎麼執行,交給服務員就好了
public void takeOrderAndBookRoom(String[] foodnames,String roomType){
kitchenService.cook(foodnames);
bookRoomService.book(roomType);
}
public void takingOrder(String[] foodnames,String[] drinknames){
kitchenService.cook(foodnames);
drinkService.taskDrink(drinknames);
}
public void takeDrink(String[] drinknames){
drinkService.taskDrink(drinknames);
}
public void bookRoom(String roomType){
bookRoomService.book(roomType);
}
public void pay(){
payService.pay();
}
}
//餐飲部門的廚房服務
class KitchenService {
public void cook(String[] foodnames){
for (String foodname:foodnames){
System.out.println("餐飲部:廚房做 :" +foodname);
}
}
}
//餐飲部門的茶水服務
class DrinkService{
public void taskDrink(String[] drinknames){
for (String drinkname:drinknames){
System.out.println("餐飲部:茶水間準備 :" +drinkname +" ");
}
}
}
//客房部門的訂房服務
class BookRoomService{
public void book(String roomType){
System.out.println("客房部:預定房間 類型爲:" +roomType);
}
}
//收銀臺的收銀服務
class PayService{
public void pay(){
System.out.println("收銀臺:結賬");
}
}
public class FacadePattern {
public static void main(String[] args) {
//迎面走來一個服務員
Waiter waiter = new Waiter();
String[] foods ={"紅燒排骨","鐵板田雞","乾煸四季豆"};
String[] drinks ={"啤酒","椰汁"};
//下單
waiter.takingOrder(foods, drinks);
//這時候還想再來一點飲料
waiter.takeDrink(new String[]{"雞尾酒"});
//吃飽喝足了,準備訂一個房間
waiter.bookRoom("大牀房");
//開始結賬
waiter.pay();
}
}
我們並不知道酒店內部是怎麼協調組織的,我們只要對服務員說我們想幹什麼就行了, 至於怎麼做,都交給服務員去完成,服務員肯定知道該找誰嘛。。。。這就是外觀模式,服務員就是酒店的外觀,我們就是客戶端,酒店後面提供的服務就是一堆子系統。我們通過外觀來實現我們想要達成的各種服務。。
爲子系統中的一組接口提供一個一致的界面,Facade模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。
類型:結構型模式。
類圖:
Facade可以提供一個簡單的缺省視圖,這一視圖對大多數用戶來說已經足夠,而那些需要更多的可定製性的用戶可以越過facade層。
2、客戶程序與抽象類的實現部分之間存在着很大的依賴性。引入facade將這個子系統與客戶以及其他的子系統分離,可以提高子系統的獨立性和可移植性。
3、當你需要構建一個層次結構的子系統時,使用facade模式定義子系統中每層的入口點。
如果子系統之間是相互依賴的,你可以讓它們僅通過facade進行通訊,從而簡化了它們之間的依賴關係。
參與者:
1、Facade
知道哪些子系統類負責處理請求。
將客戶的請求代理給適當的子系統對象。
2、Subsystemclasses
實現子系統的功能。
處理由Facade對象指派的任務。
沒有facade的任何相關信息;即沒有指向facade的指針。
門面模式的優點
門面模式的優點:
鬆散耦合
門面模式鬆散了客戶端與子系統的耦合關係,讓子系統內部的模塊能更容易擴展和維護。
簡單易用
門面模式讓子系統更加易用,客戶端不再需要了解子系統內部的實現,也不需要跟衆多子系統內部的模塊進行交互,只需要跟門面類交互就可以了。
更好的劃分訪問層次
通過合理使用Facade,可以幫助我們更好地劃分訪問的層次。有些方法是對系統外的,有些方法是系統內部使用的。把需要暴露給外部的功能集中到門面中,這樣既方便客戶端使用,也很好地隱藏了內部的細節。