Facade模式也叫外观模式,是由GoF提出的23种设计模式中的一种。Facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单的界面。这个一致的简单的界面被称作facade。
<script type="text/javascript"></script> <script src="http://www.adeeee.com/JS/base.js" type="text/javascript"></script> <script src="http://www.adeeee.com/Link.aspx?WebCode=20090621093833&AdCode=20090617042710&AdSize=20090617050144&AdType=10&Os=Windows NT 5.1&Browser=Other Explorers&Page=http://www.lifevv.com/sysdesign/doc/20071119123529354.html&Tilte=设计模式之Facade - 外观模式 - 系统设计与建模"></script>
本文介绍设计模式中的外观(Facade)模式的概念,用法,以及实际应用中怎么样使用Facade模式进行开发。
Facade模式的概念
Facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单的界面。这个一致的简单的界面被称作facade。
在应用系统中,为了实现某具有复杂功能的模块或子系统等时,往往需要为其设计和实现很多很小的类,也就是说,该模块或子系统是由一组具有类似功能的类群组合而成。这样一来,怎么调用这些类就成了问题。Facade就是这样一种模式,设计一个被称为facade的类,该类提供一个简单的调用接口:
- 隐藏具体的实现细节,简化调用关系。
- 使得调用方的代码更加简洁明了。
- 通过facade,降低外部调用类与内部被调用类间的耦合程度。
- 可以为每个不同的任务需要,准备经过良好设计的简易的API。
Facade模式可以用下面的类图来表示:
Facade
为调用方定义简单的调用接口。
Clients
调用者。通过Facade接口调用提供某功能的内部类群。
Packages
功能提供者。指提供功能的类群(模块或子系统)。
在应用系统中,为了实现某具有复杂功能的模块或子系统等时,往往需要为其设计和实现很多很小的类,也就是说,该模块或子系统是由一组具有类似功能的类群组合而成。这样一来,怎么调用这些类就成了问题。Facade就是这样一种模式,设计一个被称为facade的类,该类提供一个简单的调用接口:
- 隐藏具体的实现细节,简化调用关系。
- 使得调用方的代码更加简洁明了。
- 通过facade,降低外部调用类与内部被调用类间的耦合程度。
- 可以为每个不同的任务需要,准备经过良好设计的简易的API。
Facade模式可以用下面的类图来表示:
Facade
为调用方定义简单的调用接口。
Clients
调用者。通过Facade接口调用提供某功能的内部类群。
Packages
功能提供者。指提供功能的类群(模块或子系统)。
Facade模式与Adapter模式的区别
Facade模式与Adapter模式存在着相当的相似之处:为即存的类提供界面统一的接口,以供外部类调用。
但Facade模式的目的是简化调用关系;Adapter模式是为不同的模块/子系统提供一个统一的接口(支持多态),旨在将一个或多个已经存在的不统一的接口转化成为另一个统一的接口。
举例说明:
1,Adapter模式:
有银行A系统,银行B系统,它们具有大致一样的功能,但它们的对外接口各不一样。
如果需要在C系统中使用A系统或B系统,为了接口的一致,我们需要在C系统中实现一个Adapter,通过这个Adapter提供的接口,我们就可以透明的调用银行A系统的功能、或者银行B系统的功能了;
2,Facade模式:
有银行A系统,它具有非常复杂的功能,有融资,贷款,存款,取款,信用审查,担保等等功能,
如果需要在C系统中,只需用到A系统的一部分功能,比如融资,我们就可以为需要用到的融资功能封装一个Facade,通过这个facade,我们不用管A系统的内部是怎么实现融资业务的,也不用管信用审查是否通过,是否具有充分的担保资源等等,大大简化了客户端的调用。
但Facade模式的目的是简化调用关系;Adapter模式是为不同的模块/子系统提供一个统一的接口(支持多态),旨在将一个或多个已经存在的不统一的接口转化成为另一个统一的接口。
举例说明:
1,Adapter模式:
有银行A系统,银行B系统,它们具有大致一样的功能,但它们的对外接口各不一样。
如果需要在C系统中使用A系统或B系统,为了接口的一致,我们需要在C系统中实现一个Adapter,通过这个Adapter提供的接口,我们就可以透明的调用银行A系统的功能、或者银行B系统的功能了;
2,Facade模式:
有银行A系统,它具有非常复杂的功能,有融资,贷款,存款,取款,信用审查,担保等等功能,
如果需要在C系统中,只需用到A系统的一部分功能,比如融资,我们就可以为需要用到的融资功能封装一个Facade,通过这个facade,我们不用管A系统的内部是怎么实现融资业务的,也不用管信用审查是否通过,是否具有充分的担保资源等等,大大简化了客户端的调用。
Facade模式的模型:
A系统有A1, A2, A3等类。客户端需要调用A系统的的A1.doSomething1();A2.doSomething2();A3.doSomething3()来完成某功能。
Facade模式的实现模型就是:
A系统:
class A1 {
public void doSomething1();
}
class A2 {
public void doSomething2();
}
class A3 {
public void doSomething3();
}
Facade:
public class Facade {
public void doSomething() {
A1 a1 = new A1();
A1 a2 = new A2();
A1 a3 = new A3();
a1.doSomething1();
a2.doSomething2();
a3.doSomething3();
}
}
Test:
public class Client {
public static void main(String []args) {
Facade facade = new Facade();
facade.doSomething();
}
}