一、定义
门面模式是一种封装性质的模式。提供了一个统一的接口,用来反问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
二、适用的场景
需要对一系列接口进行封装
三、模式中的角色
门面角色(Facade):调用子系统所有功能和责任
子系统角色(SubSystem):一个或多个接口
四、应用场景举例
案例一
假设我们现实生活中的一个场景,我们通常在网购之后需要去取快递。
这个过程又分为下面4个阶段:
1. 收到取快递的通知 ,里面的信息有圆通快递,取货号12
2. 走到取快递的店面
3. 报出取货号
4. 签字,拿到快递
我们要取快递就要知道这几个步骤,当我们取了几次快递后,可能就轻车熟路了,一句“老铁,帮我取个快递”,你就能轻松完成取快递的几个步骤,而不是一步一步地照着说明书来。简而言之,就是将步骤封装成一个取快递的指令。
改造前代码样例
Express接口
public interface IExpress {
public void haveMessage(String message);
public void moveShop();
public void sayNumber(int num);
public void signName(String name);
}
Express类
public class Express implements IExpress{
@Override
public void haveMessage(String message) {
System.out.println("收到快递短信:"+message);
}
@Override
public void moveShop() {
System.out.println("走到快递店");
}
@Override
public void sayNumber(int num) {
System.out.println("报出号码:"+num);
}
@Override
public void signName(String name) {
System.out.println("收件人签字:"+name+",拿到快递");
}
}
场景类
public class Client {
public static void main(String[] args) {
String message ="圆通快递,取货号12";
int num = 12;
String name = "bigboss";
IExpress express = new Express();
express.haveMessage(message);
express.moveShop();
express.sayNumber(num);
express.signName(name);
}
}
改造后代码样例
对步骤进行封装
门面模式类
public class Facade {
private IExpress express;
public Facade(IExpress express){
this.express = express;
}
public void getExpress(String message,int num,String name){
express.haveMessage(message);
express.moveShop();
express.sayNumber(num);
express.signName(name);
}
}
场景类
public class Client {
public static void main(String[] args) {
String message ="圆通快递,取货号12";
int num = 12;
String name = "bigboss";
IExpress express = new Express();
Facade facade = new Facade(express);
facade.getExpress(message, num, name);
}
}