java 外觀模式 詳解 帶酒店管理例子

先看代碼。。
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模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。

        類型:結構型模式。

        類圖: 


         1、當你要爲一個複雜子系統提供一個簡單接口時。子系統往往因爲不斷演化而變得越來越複雜。大多數模式使用時都會產生更多更小的類。這使得子系統更具可重用性,也更容易對子系統進行定製,但這也給那些不需要定製子系統的用戶帶來一些使用上的困難。

        Facade可以提供一個簡單的缺省視圖,這一視圖對大多數用戶來說已經足夠,而那些需要更多的可定製性的用戶可以越過facade層。

        2、客戶程序與抽象類的實現部分之間存在着很大的依賴性。引入facade將這個子系統與客戶以及其他的子系統分離,可以提高子系統的獨立性和可移植性。

        3、當你需要構建一個層次結構的子系統時,使用facade模式定義子系統中每層的入口點。

        如果子系統之間是相互依賴的,你可以讓它們僅通過facade進行通訊,從而簡化了它們之間的依賴關係。

        參與者:

        1、Facade

        知道哪些子系統類負責處理請求。

        將客戶的請求代理給適當的子系統對象。

        2、Subsystemclasses

        實現子系統的功能。

        處理由Facade對象指派的任務。

        沒有facade的任何相關信息;即沒有指向facade的指針。


門面模式的優點

  門面模式的優點:

  鬆散耦合

  門面模式鬆散了客戶端與子系統的耦合關係,讓子系統內部的模塊能更容易擴展和維護。

  簡單易用

  門面模式讓子系統更加易用,客戶端不再需要了解子系統內部的實現,也不需要跟衆多子系統內部的模塊進行交互,只需要跟門面類交互就可以了。

  更好的劃分訪問層次

  通過合理使用Facade,可以幫助我們更好地劃分訪問的層次。有些方法是對系統外的,有些方法是系統內部使用的。把需要暴露給外部的功能集中到門面中,這樣既方便客戶端使用,也很好地隱藏了內部的細節。







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章