设计模式9—Façade设计模式

Facade门面设计模式为子系统中的一组接口提供一个一致的界面,应用程序本身将不再直接依赖于子系统原件,而是依赖一个门面,当想要修改某个原件的行为时,只需要修改实现类即可,应用程序本身不需要做任何修改。Facade门面设计模式结构如下:

以JDBC为例演示Facade门面设计模式:

//JDBC Facade

interface JDBCUtil{

     public Statement getStatement();

     public ResultSet getResult(String sql);

     public static void close();

}

//MySql JDBC

class MySqlUtil implements JDBCUtil {

    private static Connection conn = null;

    private static Statement st = null;

    private static ResultSet rs = null;

    private static final String DRIVER = "com.mysql.jdbc.Driver";

    private static final String URL = "jdbc:mysql://localhost:3306/test";

    private static final String USERNAME = "root";

    private static final String PASSWORD = "root";

    static {

          //写入驱动所在处,打开驱动

          try{

               Class.forName(DRIVER);

               conn = DriverManager.getConnection(URL,USERNAME,PASSWORD);

          }catch(Exception e){

               System.err.println("MySql数据库连接失败,失败原因:" + e.getMessage());

               e.printStackTrace();

          }

     }

     public Statement getStatement() {

            try{

                  st = conn.createStatement();

            }catch(Exception e){

                   System.err.println("MySql获取Statement失败,失败原因: " + e.getMessage());

                   e.printStackTrace();

                   return null;

            }

            return st;

      }

     public ResultSet getResult(Statement st,String sql){

          try{

                rs = st.executeQuery(sql);

          } catch(Exception e){

                System.err.println("MySql获取ResultSet失败,失败原因:" + e.getMessage());

                e.printStackTrace();

                 return null;

          }

          return rs;

}

public void close(Statement st,ResultSet rs){

    try{

          if(rs!=null){

              rs.close();

          if(st!= null){

              st.close();

          if(conn!=null){

               conn.close();

          }catch(Exception e){

              System.err.println("MySql数据库连接关闭失败,失败原因:" + e.getMessage());

              e.printStackTrace();

         }

     }

}

//Oracle JDBC

class OracleUtil implements JDBCUtil{

       private static Connection conn = null;

       private static Statement st = null;

       private static ResultSet rs = null;

       private static final String DRIVER = "oracle.jdbc.driver.OracleDriver";

       private static final String USERNAME = "scott";

       private static final String PASSWORD = "tiger";

       private static final String URL = "jdbc:oracle:thin:@10.9.143.59:1521:oss";

       static {

                  //写入驱动所在处,打开驱动

                  try{

                        Class.forName(DRIVER);

                         conn = DriverManager.getConnection(URL,USERNAME,PASSWORD);

                  }catch(Exception e){

                           System.err.println("Oracle数据库连接失败,失败原因:" + e.getMessage());

                           e.printStackTrace();

                   }

            }

           public Statement getStatement(){

                 try{

                        st = conn.createStatement();

                 }catch(Exception e){

                        System.err.println("Oracle获取Statement失败,失败原因:" + e.getMessage());

                        e.printStackTrace();

                        return null;

                 }

                  return st;

    }

    public ResultSet getResult(Statement st,String sql){

           try{

                   rs = st.executeQuery(sql);

           }catch(Exception e){

                   System.err.println("Oracle获取Result失败,失败原因:" + e.getMessage());

                   e.printStackTrace();

                   return null;

           }

           return rs;

}

public void close(Statement st,ResultSet rs){

        try{

              if(rs!=null)

                  rs.close();

              if(st!=null)

                   st.close();

              if(conn!=null)

                    conn.close();

          }catch(Exception e){

                System.err.println("Oracle数据库连接关闭失败,失败原因:" + e.getMessage());

                e.printStackTrace();

         }

     }

}

public class JDBCDemo{

        private static final String SQL = "select * from aaa";

        private static Statement st;

        private static ResultSet rs;

        public static void main(String[] args){

              //MySql

          JDBCUtil util = new MySqlUtil();

           st = util.getStatement();

           rs = util.getResultSet(st,SQL);

           util.close(st,rs);

         //Oracle

          JDBCUtil util = new OracleUtil();

           st = util.getStatement();

           rs = util.getResultSet(st,SQL);

           util.close(st,rs);

  }

}

MySql和Oracle不但JDBC连接的属性不同,一些sql语法也不太相同,使用门面模式之后,将MySql换成Oracle,只需要将具体的实现类替换就可以了,不会影响应用程序。

Facade门面设计模式隐藏了程序内部各个原件之间的合作行为,以及原件本身的操作与设定细节。

门面设计模式优缺点:

门面模式可以简化程序库的使用,隐藏所依赖的程序库,降低对程序库的耦合,有利于分工合作。

门面模式隐藏了各个元件之间的合作行为,以及元件本身的操作与设定细节,失去了一些直接操作元件的方便性。

JDK中门面模式应用:

java.util.logging

java.lang.Class

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值