定义:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
外观模式中有一个Facade和多个模块。
Facade:定义子系统的多个模块对外的高层接口,通常需要调用内部多个模块,从而把客户的请求代理给适当的子系统对象。
模块:接受Facade对象的委派,真正实现功能,各个模块之间可能有交互。
/**
* A模块的接口
*/
public interface AModuleApi {
public void testA();
}
/**
* A模块的实现
*/
public class AModuleImpl implements AModuleApi {
public void testA() {
System.out.println("execute module a");
}
}
/**
* B模块的接口
*/
public interface BModuleApi {
public void testB();
}
/**
* B模块的实现
*/
public class BModuleImpl implements BModuleApi {
public void testB() {
System.out.println("execute module b");
}
}
/**
* 外观对象
*/
public class Facade {
public void test() {
AModuleApi a = new AModuleImpl();
a.testA();
BModuleApi b = new BModuleImpl();
b.testB();
}
}
/**
* 客户端
*/
public class Client {
public static void main(String[] args) {
new Facade().test();
}
}
可以将外观对象写成接口:
/**
* 外观接口,可以定义多个接口
*/
public interface FacadeApi {
public void test1();
public void test2();
public void test3();
}
/**
* 外观实现
*/
public class FacadeImpl implements FacadeApi {
public void test1() {
AModuleApi a = new AModuleImpl();
a.testA();
}
public void test2() {
BModuleApi b = new BModuleImpl();
b.testB();
}
public void test3() {
AModuleApi a = new AModuleImpl();
a.testA();
BModuleApi b = new BModuleImpl();
b.testB();
}
}
通过接口实现的外观对象可以选择性的对外暴露接口。
《研磨设计模式》