外观模式:为子系统中的一组接口提供一个一致的界面。

 

也就是当我们有一组数据要访问我个模块时,每一次访问都要指向不同的模块,这样做很是麻烦而且对于内部结构来说还不是很多安全的。

为解决这样的问题我们可以从这几个模块中抽取出一个共同的门面,在外部的数据可以通过这个门面来访问其内部的所有模块,这内部结构对外是不可见的,

就要安全的多。每一次访问其内部时,只需访问这个门面既可。因此这也叫做门面模式。

举个我们常用的例子来说,我们将处理完了的数据存入到数据库中时,要使用DAO与数据库的连接。是不是我们每个向数据库中的数据进行操作的动作

都要写一个DAO去与数据库连接呢。如果这样话就太过于麻烦了,如果使用外观模式这就简单多了。

实现原理:

加载驱动;创建数据库连接;装载SQL语句;关闭连接;这些动作在每个DAO里面都有是一样的,我们可将其抽取出来放到一个门面对象中去,

该对象对外提供几个方法,从构造传入SQL语句;给每一个“?”站位符赋值;执行SQL语句;关闭连接;

对数据库的操作无外有两种,查询和修改。写两个这样的门面对象就可以完成所有对数据库的操作。

下面是例子:

package com.lovo.testfacade;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

 

public class Facade {

 

 Connection con = null;

 PreparedStatement pstmt = null;

 ResultSet result = null;

 String sql ;

 

 

 public Facade(String sql){

  this.sql = sql ;

  this.getConnection();

  try {

   this.pstmt = this.con.prepareStatement(this.sql);

  } catch (SQLException e) {

   // TODO Auto-generated catch block

   e.printStackTrace();

  }

 }

 

 

 private Connection getConnection(){

  try {

   Class.forName("net.sourceforge.jtds.jdbc.Driver");

   con = DriverManager.getConnection("jdbc:jtds:sqlserver://127.0.0.1:7788/study", "sa", "admin");

  } catch (ClassNotFoundException e) {

   // TODO Auto-generated catch block

   e.printStackTrace();

  } catch (SQLException e) {

   // TODO Auto-generated catch block

   e.printStackTrace();

  }

  return con;

 }

 

 

 

 public ResultSet executeQuery (){

  ResultSet result = null;

   try {

    result = pstmt.executeQuery();

   } catch (SQLException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

   }

  return result ;

 }

 

 

 

 public void setObject(int num , Object obj){

  try {

   pstmt.setObject(num, obj);

  } catch (SQLException e) {

   // TODO Auto-generated catch block

   e.printStackTrace();

  }

 }

 

 

 

 public void close(){

  if(null!=pstmt){

   try {

    this.pstmt.close();

   } catch (SQLException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

   }

  }

  

  if(null!=result){

   try {

    this.result.close();

   } catch (SQLException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

   }

  }

  

  if(null!=con){

   try {

    this.con.close();

   } catch (SQLException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

   }

  }

  

 }

 

 

}

 

package com.lovo.testfacade;

import java.sql.ResultSet;

import java.sql.SQLException;

 

public class TestFacadeModel {

 

 public Boolean testQuery( String name , String password ){

  String sql ="select * from myuser where name=? and password=?";

  Boolean boo = false;

  

  Facade fa = new Facade(sql);

  fa.setObject(1, name);

  fa.setObject(2, password);

  ResultSet result = fa.executeQuery();

  try {

   if(result.next()){

    boo = true ;

   }

  } catch (SQLException e) {

   // TODO Auto-generated catch block

   e.printStackTrace();

  }finally{

   fa.close();

  }

  return boo ;

 }

 

 

 public static void main(String[] args) {

  System.out.println(new TestFacadeModel().testQuery("wangl", "123"));

 }

 

}