很多的情况下,我们调用第三方的工具的时候,我们并不需要知道某一个方法是怎么运行的或者具体是怎么实现的,实际上,调用者不需要知道被调用方的具体实现,这就是门面模式。
假象一下,我们开一辆车,如果我们要手动的去打开车盖去启动引擎,然后手动的安上传动轴,然后让引擎的动力传向轮胎,使得轮胎转动,如果我们真的像上面那样操作,那我们开一次车会累成狗。
所以我们引入了“自动化”的概念,把车变为一个只要启动命令就能启动的自动系统,我们只要钥匙就能启动引擎,转动轮子。
接下来贴上代码:
引擎类:
public class Engine {
public void start(){
System.out.println("引擎启动。。");
}
public void shutdown(){
System.out.println("引擎停止。。");
}
}
轮胎类:
public class Wheel {
public void start(){
System.out.println("轮子转动");
}
public void shutdown(){
System.out.println("轮子停转");
}
}
接下来我们就要使用car来封装上面汽车的组件:
/**
* 这个Car类就是一个门面封装
* 他让car的调用者不需要知道car内部的结构,也不需要知道car是具体怎么运行的
*/
public class Car {
private Engine engine;
private Wheel wheel;
Car(){
this.engine = new Engine();
this.wheel = new Wheel();
}
public void run(){
this.engine.start();
this.wheel.start();
}
public void stop(){
this.engine.shutdown();
this.wheel.shutdown();
}
}
接下来就是门面的调用方:
public class FacadeClient {
public static void main(String[] args) {
Car car = new Car();
car.run();
car.stop();
}
}
这就是门面模式了,很简单,实际上就是把能封装的封装,额能解耦的解耦。
门面模式的优点:
1. 使得客户端和子系统之间解耦,让子系统内部的模块功能更容易扩展和维护;
2. 客户端根本不需要知道子系统内部的实现,或者根本不需要知道子系统内部的构成,它只需要跟Facade类交互即可。
3. 有些方法是对系统外的,有些方法是系统内部相互交互的使用的。子系统把那些暴露给外部的功能集中到门面中,这样就可以实现客户端的使用,很好的隐藏了子系统内部的细节。