门面模式

1、概念

    门面模式,是指提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口。使得子系统更容易使用。

2、类图

门面模式_第1张图片

3、代码

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();
  }
}

4、优缺点

(1)优点

● 松散耦合

门面模式松散了客户端与子系统的耦合关系,让子系统内部的模块能更容易扩展和维护。

● 简单易用

门面模式让子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要跟众多子系统内部的模块进行交互,只需要跟门面类交互就可以了。

● 更好的划分访问层次

通过合理使用Facade,可以帮助我们更好地划分访问的层次。有些方法是对系统外的,有些方法是系统内部使用的。把需要暴露给外部的功能集中到门面中,这样既方便客户端使用,也很好地隐藏了内部的细节。

(2)缺点

    不符合开闭原则。所谓的开闭原则是软件工程里面一个最基本的原则:对扩展开放,对修改关闭。换句话说,你的系统可以提供新的功能模块而不必进行修改。

5、经验之谈---门面模式

(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只需与业务逻辑组件交互即可。



你可能感兴趣的:(门面模式)