什么是门面模式?
门面模式也叫外观模式,是指提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口。使得子系统更容易使用。
优点:
- 减少系统相互依赖。
- 提高灵活性。
- 提高了安全性。
缺点:
不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。
使用场景:
- 为复杂的模块或子系统提供外界访问的模块。
- 子系统相对独立。
- 预防低水平人员带来的风险。
在实际的生产中最常见的门面模式的例子就是Slf4j日志框架也就是日志门面,在Slf4j之下可以使用多种日志实现框架例如 logback Log4j等。
关于Slf4j可以看:https://blog.csdn.net/qq_36110736/article/details/108066109
代码实现
首先,定义一个接口,当然也可以省略这个接口
package system;
public interface SystemX {
void doSomething();
}
继承这个类,模拟多个子系统,
package system.impl;
import system.SystemX;
public class SystemA implements SystemX {
@Override
public void doSomething() {
System.out.println("执行A事件");
}
}
package system.impl;
import system.SystemX;
public class SystemB implements SystemX {
@Override
public void doSomething() {
System.out.println("执行B事件");
}
}
package system.impl;
import system.SystemX;
public class SystemC implements SystemX {
@Override
public void doSomething() {
System.out.println("执行C事件");
}
}
Facade类
import system.SystemX;
import system.impl.SystemA;
import system.impl.SystemB;
import system.impl.SystemC;
public class Facade {
private SystemX systemA;
private SystemX systemB;
private SystemX systemC;
public Facade(){
systemA = new SystemA();
systemB = new SystemB();
systemC = new SystemC();
}
public void doA(){
systemA.doSomething();
}
public void doB(){
systemB.doSomething();
}
public void doC(){
systemC.doSomething();
}
}
测试类
public class MainClass {
public static void main(String[] args) {
Facade facaed = new Facade();
facaed.doA();
facaed.doB();
facaed.doC();
}
}
运行结果
如果没有采用门模式我们就必须采用先创建对象,在使用对象调用方法,如果需要调用的方法很多可能会非常的麻烦,就像下面
SystemA systemA = new SystemA();
SystemB systemB = new SystemB();
SystemC systemC = new SystemC();
systemA.doSomething();
systemB.doSomething();
systemC.doSomething();
此外我们还可以在门面类中将我们要执行的方法提前封装起来
public void doX(){
systemA.doSomething();
systemB.doSomething();
systemC.doSomething();
}
参考
https://baike.baidu.com/item/%E9%97%A8%E9%9D%A2%E6%A8%A1%E5%BC%8F/764642?fr=aladdin
https://www.runoob.com/design-pattern/facade-pattern.html
https://blog.csdn.net/qq_27602093/article/details/85492077