外观(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(); } }
class Database{ public Oracle getOracleObject(String username,String password,String url){} public SqlServer getSqlServerObject(String username,String password,String url){} public MySql getMySqlObject(String username,String password,String url){} }
外观模式也可以用于隐藏部分功能。在<<how tomcat works>>这本书中就几次提到外观模式,例如介绍process()方法:
1、process方法接收的参数类型为 HttpRequest 和 HttpResponse。方法签名如下: public void process(HttpRequest request, HttpResponse response); 2、process 使用了 request 和 response 的外观类,并在调用了 servlet 的 service 方法后,再调用HttpResponse 的 finishResponse 方法。示例代码如下: servlet = (Servlet) myClass.newInstance(); HttpRequestFacade requestPacade = new HttpRequestFacade(request); HttpResponseFacade responseFacade = new HttpResponseFacade(response); servlet.service(requestFacade, responseFacade); ((HttpResponse) response).finishResponse();这里之所以使用外观类,是因为,在HttpRequest和HttpResponse类中有部分属性或者方法,不希望在service()方法中被访问到,其实HttpRequestFacade和HttpResponseFacade分别是HttpRequest和HttpResponse的一个简化类。虽然这里外观类和原始类实现同样的接口,外观类只是原始类的简化,但是外观类不能继承原始类,否则service()方法中能通过上转,转换成原始类而访问被隐藏的部分。
“隐藏”是我对外观模式的应用场景的一种理解,不管是隐藏子系统的复杂性还是防止某种情况被访问到,欢迎拍砖~
原文地址:http://blog.csdn.net/wodeyuer125/article/details/44807581