外观模式定义:
外观模式:提供一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高级接口,让子系统更容易使用.
UML图:
一个典型的例子就是家庭影院系统:
如果想看电影可能需要用到多个子系统:如:电源开关,电视机开关,碟片机开关,灯光开关等等接口.
那么可不可以提供一个统一的接口给我,我可以通过watchMovie方法就可以完成所有子系统的功能呢?
可以定义一个接口,并通过组合的方式将所有子系统接口的方法在WatchMovie()中调用.
这样只要把实例化好的接口传给这个统一的接口对象就可以了.
同样可以进行close操作.
类似的在进行数据库操作时我们一般要提供一个DbUtil类,其实就是做了一个统一的接口让业务层进行调用.这也是Facade的一个示例.
如JDBC做数据库查询时候,如果面向的是多个不同类型的数据库开发。。
package com.lwf.object.facade; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public abstract class Facade { Connection conn = null; Statement stmt = null; ResultSet rs = null; String sqlStr = ""; abstract void getConnection(); public void createStatement() { try { stmt = conn.createStatement(); } catch (SQLException e) { e.printStackTrace(); } } public void executeQuery(){ try { rs = stmt.executeQuery(sqlStr); } catch (SQLException e) { e.printStackTrace(); } } public void doQuery(String sqlStr){ this.sqlStr = sqlStr; getConnection(); createStatement(); executeQuery(); } public void close(){ try { rs.close(); stmt.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }
package com.lwf.object.facade; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class MySQL extends Facade{ public MySQL(){ } public void getConnection() { try { Class.forName("org.postgresql.Driver"); conn = DriverManager.getConnection("jdbc:postgresql://localhost/GACO","admin","passwd"); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } }
package com.lwf.object.facade; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class TestFacade { public static void main(String[] args) { String sqlStr = "select * from \"user\""; String sqlStr1 = "select * from company"; Facade m = new MySQL(); try { m.doQuery(sqlStr); m.doQuery(sqlStr1); while(m.rs.next()){ System.out.println(m.rs.getString(3)); } } catch (Exception e) { e.printStackTrace(); } finally{ m.close(); } } }
外观模式的意图就是提供一个简单的接口,从而让我们的子系统更易于使用.
最少知识原则:只和你的密友谈话
意思当我们设计系统的时候要尽量减少对象间的交互,只留下几个密友.就是不要让太多的类耦合在一起,从而避免了修改系统的一部分功能会影响其它的功能.从而减少了维护的花费.
方针:
对象的方法应该只调用 :
1.对象本身
2.被当作方法参数而传进来的对象
3.此方法所创建或实例化的对象
4.对象的组件:理解为通过组合的其它对象.has-a
如类:
public class Test{ private Watch watch; private float getWatchFloat(){ return watch.getWatch().getFloat(); } }
上面方法调用中优化一下,应该在Watch中加入getFloat方法