一、概念
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只需与业务逻辑组件交互便可。