设计模式之略见一斑(外观模式Facade)

本文介绍了外观模式的概念及其在软件设计中的应用。通过一个数据库连接的例子,展示了如何使用外观模式来简化客户端与子系统间的交互,减少代码耦合度,并提高系统的可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

外观模式又称门面模式,它是为了给子系统中提供一个一致的界面,从面定义了一个高层接口 ,这个接口使得这一子系统更加容易使用。定义中提到的子系统指在设计中为了降低复杂性根据一定的规则,对系统进行的划分,子系统封装有一些类,客户程序在使用子系统的时候,可能会像下图一样零乱。


 上面的实现中,客户紧紧依赖在子系统的实现,如果子系统发生了变化,极有可能响应到客户类的调用,而且在子系统在不断优化时会产生更多的小类。

  外观模式就是为了解决这种问题而产生的,下面是使用了门用模式后的图



 这样就明显减少了客户程序和子系统之间的偶合,增加了可维护性。

 

例子:

  数据库连接这个例子在我们日常中很常用,在用JSP做页面开发的时候,我们经常会用到连接数据库,很多初学者都是直接用下面的代码(直接连接数据库,然后获得连接后直接进行增删改查)

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

 

但是这样的代码很有弊端,如我们如果想要换个数据库,这个时候就要大量改动代码

为了避免这种情况,我们就可以把获得连接抽象出来,从而在每次需要对数据库进行操作的时候,只需要获得连接。甚至也可以建立一个连接池。

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

 

优点:

1)对客户屏蔽子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便

2)它实现了子系统与客户之间在的耦合关系,而子系统内部的功能组件往往是紧耦合的,松耦合关系使得子系统的组件变化不会影响到它的客户,facad模式有助于建立层次结构系统,也有助于对对象之间原依赖关系分层,facade模式可以消除复杂的循环依赖关系。这一点在客户程序与子系统是分别实现的时候极为重要。

 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值