定义:
提供了一个统一的接口,用于访问子系统一群功能的相关接口。就是将一群子系统,或者对象,或者接口等继续统筹,分类,组装成统一的接口,解耦内部和外部,同时降低复杂度。通俗的说,就是在一群接口外面再包一层。
图示:

案例分析:
假如我们要进行炒菜,这个过程中,对象有煤气罐(GasCylinder),炉灶(KitchenRange),食物(food),佐料(condiment)。
那么操作过程为:
1-> 打开煤气(GasCylinder)
2-> 打开炉灶(KitchenRange)
3-> 下油(condiment)
4-> 下食物(food)
5-> 下盐(condiment)
6-> 关闭炉灶(KitchenRange)
7->关闭煤气(GasCylinder)
一个人要完成炒菜过程,需要协调多个对象,发生什么变更,可维护性变得很差,例如将煤气变成天然气,这时变动将变得超级复杂,从外部到内部需要调整,过于复杂,耦合性过于高。
经过分析,一个炒菜过程可以分为三个步骤,第一起火,第二炒菜,第三关火,那么可以设计一个对象,来协调封装这些复杂,炒菜的人只需要关系他要执行的三个步骤即可。
代码实例如下:
对象类:
public class Food {
private static Food food = null;
private Food() {
};
public static synchronized Food getFood() {
if (food == null) {
food = new Food();
}
return food;
}
public void AddFood() {
System.out.println("Add Food");
}
}
package com.ygk.facade;
public class Condiment {
private static Condiment condiment = null;
private Condiment() {
};
public static synchronized Condiment getCondiment() {
if (condiment == null) {
condiment = new Condiment();
}
return condiment;
}
public void AddCookingOil(){
System.out.println("Add cooking oil");
}
public void AddCookingSalt(){
System.out.println("Add cooking Salt");
}
}
package com.ygk.facade;
public class GasCylinder {
private static GasCylinder gasCylinder = null;
private GasCylinder() {
};
public static synchronized GasCylinder getGasCylinder() {
if (gasCylinder == null) {
gasCylinder = new GasCylinder();
}
return gasCylinder;
}
public void on() {
System.out.println("GasCylinder ON");
}
public void off() {
System.out.println("GasCylinder OFF");
}
}
package com.ygk.facade;
public class KitchenRange {
private static KitchenRange kitchenRange = null;
private KitchenRange() {
};
public static synchronized KitchenRange getKitchenRange() {
if (kitchenRange == null) {
kitchenRange = new KitchenRange();
}
return kitchenRange;
}
public void on() {
System.out.println("KitchenRange ON");
}
public void off() {
System.out.println("KitchenRange OFF");
}
}
外观类:
public class KitchenFacade {
Food food = null;
Condiment condiment = null;
GasCylinder gasCylinder = null;
KitchenRange kitchenRange = null;
public KitchenFacade() {
food = Food.getFood();
condiment = Condiment.getCondiment();
gasCylinder = GasCylinder.getGasCylinder();
kitchenRange = KitchenRange.getKitchenRange();
}
public void begin() {
gasCylinder.on();
kitchenRange.on();
}
public void cook() {
condiment.AddCookingOil();
food.AddFood();
condiment.AddCookingSalt();
}
public void end() {
gasCylinder.off();
kitchenRange.off();
}
}
外部类:
public class Cook {
public static void main(String[] args) {
KitchenFacade kf=new KitchenFacade();
kf.begin();
kf.cook();
kf.end();
}
}
来源:https://www.cnblogs.com/zhuangxr/p/6845928.html