`

深入浅出设计模式八——Facade模式(结构型)

阅读更多

外观模式定义:

外观模式:提供一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高级接口,让子系统更容易使用.

 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方法

分享到:
评论

相关推荐

    深入浅出设计模式(中文版电子版)

    第4章GoF-StructuralDesignPatterns结构型设计模式 95 4.1AdapterPattern(适配器模式) 96 4.1.1定义 96 4.1.2现实中的实例——电脑电源适配器 97 4.1.3C#实例——化学数据银行 98 4.1.4Java实例——清洁系统 ...

    设计模式精解-GoF23种设计模式解析附C实现源码.pdf

    《设计模式精解——GoF23种设计模式解析附C实现源码》这本书提供了深入浅出的设计模式讲解,同时通过C语言的具体实现案例,帮助读者更好地理解和应用这些模式。 #### 二、设计模式简介 设计模式是一种通用的、在...

    JAVA设计模式(中文).chm

    《JAVA设计模式(中文).chm》是一部专为Java开发者准备的设计模式指南,它深入浅出地阐述了软件工程中的重要概念——设计模式。设计模式是解决常见编程问题的成熟解决方案,是经验丰富的开发者们在实践中总结出的最佳...

    design-pattern-java.pdf

    扩展系统功能——装饰模式(三) 扩展系统功能——装饰模式(四) 外观模式-Facade Pattern 深入浅出外观模式(一) 深入浅出外观模式(二) 深入浅出外观模式(三) 享元模式-Flyweight Pattern 实现对象的复用——...

    HeadFirst Design Pattern

    这本书深入浅出地介绍了软件工程中的核心概念——设计模式,这些模式是经验丰富的开发者在解决常见问题时总结出的最佳实践。 设计模式是对在特定情境下软件设计问题解决方案的一种描述,它们是可复用的,能够提升...

    Design Patterns Elements Of Reusable Object-Oriented Software

    通过上述分析可以看出,《设计模式——可重用面向对象软件的要素》是一本深入浅出地介绍了设计模式的重要书籍。无论是对于初学者还是有经验的开发人员来说,这本书都能够提供有价值的指导和启发。

Global site tag (gtag.js) - Google Analytics