一、介绍:
引用《研磨设计模式》中的定义:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这一接口使得这一子系统更易于使用。
外观模式的本质是——封装交互、简化调用。
什么意思呢?外观模式封装交互的目的,就是简化调用。说白了,就是要讲各个模块之间复杂的交互,放到外观类的某些方法中。然后在外观类中选择性的将某些方法暴露给外部去调用。这样一来,对于外部而言,调用功能就非常简单了,而且还隐藏了各个模块的实现细节。
二、结构
1、Facade——对外的高层接口。
2、Client——调用者
3、ModelApiX——模块接口
4、ModelApiXImpl——模块接口实现类
三、我的实现
1、我们有这样3个模块A、B、C,对应接口如下:
packagefacade; public interfaceInterfaceA { public voida1(); public voida2(); }
packagefacade; public interfaceInterfaceB { public voidb1(); public voidb2(); }
packagefacade; public interfaceInterfaceC { public voidc1(); public voidc2(); }
2、有对应3个实现类,如下:
packagefacade; public class ImplA implementsInterfaceA { @Override public voida1() { //TODO Auto-generated method stub System.out.println("al"); } @Override public voida2() { //TODO Auto-generated method stub System.out.println("a2"); } }
packagefacade; public class ImplB implementsInterfaceB { @Override public voidb1() { //TODO Auto-generated method stub System.out.println("b1"); } @Override public voidb2() { //TODO Auto-generated method stub System.out.println("b2"); } }
packagefacade; public class ImplC implementsInterfaceC{ @Override public voidc1() { //TODO Auto-generated method stub System.out.println("c1"); } @Override public voidc2() { //TODO Auto-generated method stub System.out.println("c2"); } }
3、模块A、B、C,中有一部分方法是打算暴露给调用者,有一部分则打算隐蔽。
为此我们定义一个外观接口:
packagefacade; public interfaceFacadeInterface { public voida1(); public voidb1(); public voidc1(); public voidtest(); }
一个实现类,如下:
packagefacade; public class Facade implementsFacadeInterface { InterfaceA a = newImplA(); InterfaceB b = newImplB(); InterfaceC c = newImplC(); @Override public voida1() { //TODO Auto-generated method stub a.a1(); } @Override public voidb1() { //TODO Auto-generated method stub b.b1(); } @Override public voidc1() { //TODO Auto-generated method stub c.c1(); } @Override public voidtest() { //TODO Auto-generated method stub a.a2(); b.b2(); c.c2(); } }
于是,由于组件之间的组合在外观实现类中已经组合完毕,因此,客户端调用时,便相当简单,如下:
packagefacade; public classclient { public static voidmain(String[] args) { FacadeInterface facade = newFacade(); facade.test(); } }