门面模式(Facade Pattern):也叫外观设计模式,该模式对外有一个统一接口,用来访问子系统中的一群接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。
其实我们在写代码时,有意无意的都在大量的使用门面设计模式,但凡高层模块需要调度多个子系统时,我们都会自觉的创建一个新类来封装这些子系统,提供精简的调用方式,让高层模块可以更加容易地间接调用这些子系统的功能;包括我们以前编写的Utils工具类、拦截器、过滤器、网关等都是提供一个调用入口,由这些门面来负责调用复杂的子系统;
门面设计模式主要解决的问题就是:降低访问复杂系统的内部子系统时的复杂度,简化客户端之间的接口。
Tips:门面设计模式就是迪米特法则的具体应用;
门面设计模式具备如下几个角色:
【案例】
照顾小孩子需要负责小孩子的饮食起居,包括做饭,洗衣服,遛孩子等等…带一个小孩子非常麻烦,于是我们请到一个保姆来帮助我们干这些事情;
UML类图如下:
package com.patter.demo;
/**
* @author lscl
* @version 1.0
* @intro: 带孩子-子系统
*/
public class CareChild {
public void doCareChild(String destName) {
System.out.println("遛孩子,带孩子【" + destName + "】...");
}
}
package com.patter.demo;
/**
* @author lscl
* @version 1.0
* @intro: 做饭-子系统
*/
public class Cooking {
public void doCooking(String menu) {
System.out.println("【给孩子吃" + menu + "】");
}
}
package com.patter.demo;
/**
* @author lscl
* @version 1.0
* @intro: 换洗衣服-子系统
*/
public class Laundry {
public void doLaundry(){
System.out.println("帮孩子换洗衣服...");
}
}
package com.patter.demo;
/**
* @author lscl
* @version 1.0
* @intro: 保姆-门面角色
*/
public class BabySister {
private CareChild careChild = new CareChild();
private Cooking cooking = new Cooking();
private Laundry laundry = new Laundry();
// 带孩子经费
private Double money = 4000.0D;
public BabySister(Double money) {
this.money = money;
}
public BabySister() {
}
/**
* 带孩子
*/
public void careChild() {
if (money < 5000.0D) {
careChild.doCareChild("省内游");
} else if (money >= 5000 && money < 8000) {
careChild.doCareChild("国内游");
} else if (money >= 8000) {
careChild.doCareChild("全球游");
}
}
/**
* 做饭
*/
public void cooking() {
if (money < 5000) {
cooking.doCooking("大白菜,豆芽菜");
} else if (money >= 5000 && money < 8000) {
cooking.doCooking("小青菜,辣椒炒肉");
} else if (money >= 8000) {
cooking.doCooking("小青菜,辣椒炒肉,糖醋排骨");
}
}
/**
* 洗衣服
*/
public void laundry() {
laundry.doLaundry();
}
}
门面设计模式和我们之前的代理设计模式有些许类似,但是却有本质上的不同,代理设计模式主要关注的是对一个类的增强或保护,门面设计模式则是对多个子系统的统一管理;