外观模式:为子系统中的一组接口提供一个一致的界面。
也就是当我们有一组数据要访问我个模块时,每一次访问都要指向不同的模块,这样做很是麻烦而且对于内部结构来说还不是很多安全的。
为解决这样的问题我们可以从这几个模块中抽取出一个共同的门面,在外部的数据可以通过这个门面来访问其内部的所有模块,这内部结构对外是不可见的,
就要安全的多。每一次访问其内部时,只需访问这个门面既可。因此这也叫做门面模式。
举个我们常用的例子来说,我们将处理完了的数据存入到数据库中时,要使用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"));
}
}