facade外观模式,简单明了的讲是,子系统封装聚集模式。facade外观模式遵循了迪米特法则,体现了松耦合原则。facade所面对的往往是多个类或其它程序单元,通过重新组合各类及程序单元,对外提供统一的接口,以便维护管理,减少复杂度和依赖性。
facade外观模式有点像数据库中视图的味道。在数据库中的视图对n个表的组合,客户端程序通过访问数据库的视图,而不必直接访问表,这样就减少了sql语句的编写,也可以减少很多代码量。如果数据的表万一有所改动,一般修改对应的视图就行了,如果要修改客户端程序,工作也不会很大。数据库的表之间的关系越复杂,越能体现这一点。
而在一个软件系统中,一个子系统(含有n>=1的个类)可能会有m个用户类调用,在最坏的情况下,如果这n个类的接口都要修改一下,那么就会有n+m的修改工作量。例如,在现实的软件开发中,如果需求变更,或者起先的设计错误,需要对代码进行修改,又恰恰碰到这种代码结构,如果应用了facade外观模式,修改的工作量将会大大的减少。例如:spring的示范例子jpetstore里面的org.springframework.samples.jpetstore.domain.logic.PetStoreFacade,ejb3的petstore里面的PetStoreService,PetStoreApplication等,就是一些典型的例子。
facade外观模式的代码框架:
public class MyClass1{
public void func(){}
}
public class MyClass2{
public void func(){}
}
public class Facade{
public void func(){
MyClass1 obj1 = new MyClass1();
obj1.func();
MyClass2 obj2 = new MyClass2();
obj2.func();
}
}
public class Client{
public static void main(String args[]){
Facade facade = new Facade();
facade.func();
}
}