一、概念
java
門面模式,是指提供一個統一的接口去訪問多個子系統的多個不一樣的接口,它爲子系統中的一組接口提供一個統一的高層接口。使得子系統更容易使用。tomcat
二、類圖session
三、代碼架構
package com.yujin.facade; /** * 付款類 */ public class Payment { public String pay(double money){ String food = "宮保雞丁"; System.err.println("你已支付:¥"+money+"購買了("+food+")"); return food; } }
package com.yujin.facade; /** * 製做菜餚 */ public class Cook { public void cook(String food){ System.err.println("五星級廚師正在爲您精心製做"+food); } }
package com.yujin.facade; /** * 服務員傳菜 */ public class Waiter { public void writer(String food){ System.err.println("服務員正在爲您傳"+food); } }
package com.yujin.facade; /* * 在這裏咱們能夠爲Payment Cook Watier設計一個門面 */ public class Facade { //方法一 private Payment p = new Payment(); private Cook c = new Cook(); private Waiter w = new Waiter(); public void serveFood() { String food = p.pay(12.7); c.cook(food); w.writer(food); } }
package com.yujin.facade; /** * 傳統模式下開發顧客(消費者) * 缺點:耦合度太大 */ public class Customer { public void haveDinner(){ /* Payment p = new Payment(); Cook c = new Cook(); Waiter w = new Waiter(); String food = p.pay(12.5f); c.cook(food); w.writer(food);*/ // Facade f = new Facade(); f.serveFood(); } /** * 測試 * @param args * date: 2016年2月17日-上午11:55:50 * since: version1.0 * author: yujin */ public static void main(String[] args) { new Customer().haveDinner(); } }
四、優缺點測試
(1)優勢spa
● 鬆散耦合設計
門面模式鬆散了客戶端與子系統的耦合關係,讓子系統內部的模塊能更容易擴展和維護。code
● 簡單易用orm
門面模式讓子系統更加易用,客戶端再也不須要了解子系統內部的實現,也不須要跟衆多子系統內部的模塊進行交互,只須要跟門面類交互就能夠了。接口
● 更好的劃分訪問層次
經過合理使用Facade,能夠幫助咱們更好地劃分訪問的層次。有些方法是對系統外的,有些方法是系統內部使用的。把須要暴露給外部的功能集中到門面中,這樣既方便客戶端使用,也很好地隱藏了內部的細節。
(2)缺點
不符合開閉原則。所謂的開閉原則是軟件工程裏面一個最基本的原則:對擴展開放,對修改關閉。換句話說,你的系統能夠提供新的功能模塊而沒必要進行修改。
五、經驗之談---門面模式
(1)tomcat應用
request組件
(2)Spring應用
Spring的HibernateTemplate類就是使用的門面模式:當咱們的程序使用Hibernate的find()方法時,程序只要一行代碼便可獲得查詢返回的List。但實際上該find()方法後隱藏了以下代碼:
Session session = sf.openSession(); Query query = session.createQuery(hql); for(int i=0; i<args.length; i++) { query.setParameter(i, args[i]); } query.list();
所以咱們能夠認爲HibernateTemplate是SessionFactory,Session、Query等類的門面。當客戶端程序須要進行持久化查詢時,程序無需調用這些類,而是直接調用HibernateTemplate門面類中的相印方法便可。
(3)三層架構值門面模式
JavaEE應用裏使用業務邏輯組件來封裝DAO組件也是典型的門面模式——每一個業務邏輯組件(通常是Service層)都是衆多DAO組件的門面,系統的控制器類無需直接訪問DAO組件,而是由業務邏輯方法來組合多個DAO方法以完成所需功能。而Action只需與業務邏輯組件交互便可。