1、概述
外观模式(门面模式):通过在子系统和外部系统之间引入一个门面(Facade),来实现外部系统与子系统间的通信,门面提供一个高层次的接口(将子系统中的方法进行整合),使子系统更易于使用。
2、门面模式实例
普通模式:
门面模式:
代码实例:
//子系统的调用者,不在直接调用子系统中的方法,而是通过门面来完成对子系统的调用
public class Employer {
public static Contractor contractor=new Contractor();
public static void main(String[] args) {
contractor.buildHouse();
}
}
//门面内对子系统中的方法进行整合,提供接口来实现外部与子系统之间的信息交互
public class Contractor {
public Mason mason=new Mason();
public Brickwork brickwork=new Brickwork();
public Bricklayer bricklayer=new Bricklayer();
public void buildHouse(){
System.out.println("我是包工头,我在指挥工人建房");
mason.mix();
brickwork.moveBrick();
bricklayer.buildWall();
}
}
//子系统模块1
public class Bricklayer {
public void buildWall(){
System.out.println("我是砌墙工,我正在砌墙");
}
}
//子系统模块2
public class Brickwork {
public void moveBrick(){
System.out.println("我是搬砖工,我正在搬砖");
}
}
//子系统模块2
public class Mason {
public void mix(){
System.out.println("我是和泥工,我正在和泥");
}
}
3、门面模式的经典实践——slf4j
(1)slf4j(Simple Logging Facade for java):java的简单日志门面,通过门面模式来实现,在项目代码中通过调用统一的slf4j接口来调用日志相关功能,而不需要在写代码时关心日志实现的具体框架。因此当底层的日志实现框架发生改变时代码不需要修改。
(2)实现的原理
a、slf4j只是接口,不包含具体的实现
b、log4j,java.util.logging(图中灰色部分)等才是正真的日志实现框架
c、由于不同种日志实现框架对外提供的调用方法是不同的,为了将其统一成相同的slf4j接口,就需要在slf4j和正真的实现框架中增加一层适配层(图中墨绿色部分),每个具体的实现对应一个适配层
d、整个日志系统中,slf4j就是门面,而下面的多种日志实现框架的适配层和底层实现就是我们在门面模式中所说的子系统
4、slf4j与log4j绑定使用
(1) log4j不是对slf4j的原生实现,所以slf4j api在调用log4j时需要一个适配层,因此不能分别单独的引入log4j和slf4j。而是通过在pom文件中引入slf4j-log4j12依赖,如图会在项目中自动引入log4j,slf4j及适配层3个jar包。
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
<scope>compile</scope>
</dependency>
(2)在项目resourc文件夹下配置配置log4j.properties文件
5、slf4j和logback绑定使用
(1)logback是对slf4j接口的直接实现是不需要适配层的,可以直接通过引入logback-classic来使用
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
(2)在项目resourc文件夹下配置配置logback.xml文件
6、同时使用log4j和logback两种框架时,哪个依赖出现在pom文件的更前面就会使用哪种实现
7、使用slf4j打印日志
(1)普通方式:
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
private static final Logger log= LoggerFactory.getLogger(HelloServlet.class);
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
log.info("hello");
}
}
(2)lombok标签的方式:
@Slf4j
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
log.info("hello");
}
}