外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
外观模式,通过外观的包装,只对外暴露外观对象,屏蔽具体的细节,降低了程序的复杂度,提高了程序的可维护性,体现了迪米特法则。
外观模式主要涉及2部分:
- 外观类:知道哪些具体类负责处理请求,将客户的请求代理给适当的具体对象。
- 具体类:实现具体功能,处理外观对象指派的任务。
果汁店提供苹果橘子汁、橘子西瓜汁等其他果汁,消费者购买的时候只关心果汁店是否提供了一杯完整的果汁,而不关心这杯果汁是怎么来的。在这里,果汁店起到了外观类的作用,果汁店提供苹果橘子汁、橘子西瓜汁这两种方法,苹果、橘子、西瓜是具体类,均实现了榨汁这个操作。
- 苹果
public class Apple {
public void juicing() {
System.out.println("apple juicing");
}
}
- 橘子
public class Orange {
public void juicing() {
System.out.println("orange juicing");
}
}
- 西瓜
public class Watermelon {
public void juicing() {
System.out.println("watermelon juicing");
}
}
- 果汁店
public class FruitJuiceShop {
private Apple apple;
private Orange orange;
private Watermelon watermelon;
public FruitJuiceShop() {
apple = new Apple();
orange = new Orange();
watermelon = new Watermelon();
}
public void appleOrangeJuice() {
System.out.println("apple orange juice :");
apple.juicing();
orange.juicing();
}
public void orangeWatermelonJuice() {
System.out.println("orange watermelon juice :");
orange.juicing();
watermelon.juicing();
}
}
- 客户端测试类
public class Client {
public static void main(String[] args) {
FruitJuiceShop fruitJuiceShop = new FruitJuiceShop();
fruitJuiceShop.appleOrangeJuice();
fruitJuiceShop.orangeWatermelonJuice();
}
}
运行结果:
apple orange juice :
apple juicing
orange juicing
orange watermelon juice :
orange juicing
watermelon juicing
外观模式通常应用在新老系统的交互上,新系统提供一个外观类来与遗留代码来完成所有复杂工作交互。