门面模式

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

相关文章
相关标签/搜索