外观模式: 为子系统中的一组接口提供一个一致的界面,外观模式(Facade)定义了一个高层接口,这个接口使得这一子系统更加容易使用
package pattern.facade;
public interface AModuleApi {
public void testA();
}
----
package pattern.facade;
public class AModuleApiImpl implements AModuleApi {
@Override
public void testA() {
System.out.println("A module");
}
}
----
package pattern.facade;
public interface BModuleApi {
public void testB();
}
----
package pattern.facade;
public class BModuleApiImpl implements BModuleApi{
@Override
public void testB() {
System.out.println("B module");
}
}
----
package pattern.facade;
public interface CModuleApi {
public void testC();
}
----
package pattern.facade;
public class CModuleApiImpl implements CModuleApi{
@Override
public void testC() {
System.out.println("C module");
}
}
----
package pattern.facade;
public class Facade {
public void test(){
AModuleApi aModuleApi = new AModuleApiImpl();
aModuleApi.testA();
BModuleApi bModuleApi = new BModuleApiImpl();
bModuleApi.testB();
CModuleApi cModuleApi = new CModuleApiImpl();
cModuleApi.testC();
}
}
----
package pattern.facade;
public class Client {
public static void main(String[] args) {
new Facade().test();
}
}
外观模式特点:
外观模式的目的不是给予系统添加新的功能接口,而是为了让外部减少与子系统内部多个模块的交互,松散耦合,从而让外部能够更简单地使用子系统,外观应该是包装已有的功能,它主要复制组合以后功能来实现客户需求,而不是添加新的实现
外观模式的优点:
1、松散耦合
外观模式松散了客户端与子系统的耦合关系,让子系统内部的模块更容易扩展和维护
2、简单易用
外观模式让子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要跟众多子系统内部的模块进行交互,只需要跟外观交互就可以了,相当于外观类为外观客户端使用子系统提供了一站式服务
3、更好地划分访问的层次
通过合理地使用Facade,可以帮助我们更好地划分访问的层次,有些方法是对系统外的,有些方式是系统内部使用的,把需要暴露给外部的功能集中到外观中,这样即方便客户端的使用,也很好地隐藏了内部的细节
ps:外观模式的本质是:封装交互,简化调用
何时选用外观模式:
1、如果你希望为一个复杂的子系统提供一个简单接口的时候,可以考虑使用外观模式。使用外观对象来实现大部分客户端需要的功能,从而简化客户的使用。
2、如果想要让客户程序和抽象类的实现松散耦合,可以考虑使用外观模式,使用外观对象来将这个子系统与它的客户分离开来,从而提高子系统的独立性和可移植性
3、如果构建多层结构的系统,可以考虑使用外观模式,使用外观对象作为每层的入口,这样可以简化层间的调用,也可以松散层次之间的耦合关系