Facade模式例子的迷惑

文艺青年2 2002-10-23 03:38:01
大家如果阅读过:板桥里人 http://www.jdon.com 2002/4/6/的文章
他对Facade模式举的例子如下:
Facade的定义: 为子系统中的一组接口提供一个一致的界面.

Facade一个典型应用就是数据库JDBC的应用,如下例对数据库的操作:

public class DBCompare {


  Connection conn = null;
  PreparedStatement prep = null;
  ResultSet rset = null;
  try {
     Class.forName( "<driver>" ).newInstance();
     conn = DriverManager.getConnection( "<database>" );
    
     String sql = "SELECT * FROM <table> WHERE <column name> = ?";
     prep = conn.prepareStatement( sql );
     prep.setString( 1, "<column value>" );
     rset = prep.executeQuery();
     if( rset.next() ) {
        System.out.println( rset.getString( "<column name" ) );
     }
  } catch( SException e ) {
     e.printStackTrace();
  } finally {
     rset.close();
     prep.close();
     conn.close();
  }
}



上例是Jsp中最通常的对数据库操作办法.

在应用中,经常需要对数据库操作,每次都写上述一段代码肯定比较麻烦,需要将其中不变的部分提炼出来,做成一个接口,这就引入了facade外观对象.如果以后我们更换Class.forName中的<driver>也非常方便,比如从Mysql数据库换到Oracle数据库,只要更换facade接口中的driver就可以.

我们做成了一个Facade接口,使用该接口,上例中的程序就可以更改如下:

public class DBCompare {

  String sql = "SELECT * FROM <table> WHERE <column name> = ?";  

  try {
     Mysql msql=new mysql(sql);
     prep.setString( 1, "<column value>" );
     rset = prep.executeQuery();
     if( rset.next() ) {
        System.out.println( rset.getString( "<column name" ) );
     }
  } catch( SException e ) {
     e.printStackTrace();
  } finally {
     mysql.close();
     mysql=null;
  }
}

---------------------------------------------------------------完
但是我觉得他举的例子非常不严谨,试想:如果我们的代码中充满了
Mysql m = new Mysql(sql)....
那么如果我将自己开发的系统移植到Oracle,或者Sybase下
不是要在每一段操作数据库代码下写上
Oracle d = new Oracle()

Sybase d = new Sybase()吗??

所以,我觉得他这个例子不恰当,因为我身边有人已经把他的东西全照搬过来了
...全文
71 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
fangsoft 2003-04-27
  • 打赏
  • 举报
回复
facade的中文意义可以叫做“正门”,其意不言自明,即通道。在面向对象设计时有两种不同的设计思路,面向CLIENT,即用类来实现功能时
要求接口简单;在系统内部设计时追求重用性,导致类的粒度渐细,这样,就产生了一个问题,如果在CLIENT的程序里直接调用系统内部的
细粒度的对象,将导致系统内部与功能实现直接耦合,而且,CLIENT的程序还要维护系统内部细粒度的对象之间的逻辑关系,因此,在它们
中间引入了facade,当作client程序访问系统内部的通道。

另外,很多讲模式的书重点似乎在代码如何实现一个模式上,大家看过之后,似乎已理解,但想应用它们时总感觉还差一点点,模式是设计
语言,应在问题的基础上来讲,即:有一个问题和设计目标,用何种技术来实现最好,能达到什么效果,至于代码实现是水到渠成的事情。
大家回忆一下,GOF的书的代码部分是很少的。

fangsoft
4/27,2003
richardluopeng 2003-04-22
  • 打赏
  • 举报
回复
banq的例子本身就不是很严谨的,呵呵
我就事论事,别无它意,呵呵
tonight77 2003-04-21
  • 打赏
  • 举报
回复
同意super_zzw所说的
DavidBone 2003-04-20
  • 打赏
  • 举报
回复
up
fox_blue 2002-12-29
  • 打赏
  • 举报
回复
Facade Pattern

Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use.

Basically, this is saying that we need a new way to interact with a system that is easier than the current way, or we need to use the system in a particular way. we can build such a method of interaction because we only need to use a subset of the system in question.
fastmask 2002-11-16
  • 打赏
  • 举报
回复
对,那只是一个例子阿,说明了这个含义,有人不加修改的使用,那是个人问题,他这个例子是不恰当,但是其含义是没有错的。
shupu 2002-10-31
  • 打赏
  • 举报
回复
同意楼上的看法!
super_zzw 2002-10-30
  • 打赏
  • 举报
回复
他只是说明Facade模式而已,你看懂这个模式的意义就行了
他的程序有多大的缺陷着并不重要
如何使用这个模式那是你自己的事,别人没有叫你拷贝他的程序
你说呢
cxhz_cn 2002-10-26
  • 打赏
  • 举报
回复
还是不明白Facade到底怎么回事情~~

希望解释一下~~

我的QQ:503071,我也刚在学习design patterns

Rocken 2002-10-25
  • 打赏
  • 举报
回复
没什么不对啊!板桥里人关注的是怎样封装具体数据库的访问,你关注的应该是怎样封装不同的数据库的访问。你只要把什么Oracle、MySql等封装起来,比如叫Database,那使用的地方就全部同一换成
Database d = new Database()
需要改变后台数据库时,改变Database的配置就可以了。用MySql配置就支持MySql,用Oracle配置就支持Oracle。解决问题!
raoqn 2002-10-23
  • 打赏
  • 举报
回复
呵呵,有点意思,我现在就在用它得Mysql mysql = new Mysql呵呵!!

50,687

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧