外觀(Facade)模式,又叫做門面模式,是一種通過為多個複雜的子系統提供一個一致的介面,使這些子系統更加容易被訪問的模式。比如說我們日常生活中醫院的分診台,就是實現統一訪問介面的特性: 一、外觀模式介紹 外觀模式提供一個統一介面,用來訪問子系統的一系列介面,從而讓子系統更容易使用。這個子系統可以有 ...
外觀(Facade)模式,又叫做門面模式,是一種通過為多個複雜的子系統提供一個一致的介面,使這些子系統更加容易被訪問的模式。比如說我們日常生活中醫院的分診台,就是實現統一訪問介面的特性:
一、外觀模式介紹
外觀模式提供一個統一介面,用來訪問子系統的一系列介面,從而讓子系統更容易使用。這個子系統可以有多種理解方式,它既可以是一個完整的系統,也可以是更細粒度的類或者模塊。主要用在介面設計方面,下麵就來看看外觀模式的結構:
1.1 外觀模式的結構
Facade
:外觀類角色,作用是為多個子系統提供一個統一介面SubSystem1、SubSystem2、SubSystem3
:子系統角色,以及內部實現的功能Client
:客戶端,通過外觀類對子系統集合中的功能進行訪問
從上面的結構圖我們可以看出,外觀模式的結構比較簡單,就是相當於對一組子類功能的封裝和抽象。它其實就是前面提到過的設計模式原則中“迪米特原則”的典型應用:兩個有交互的系統,只暴露有限且必要的介面。
下麵來看看外觀模式的簡單實現:
1.2 外觀模式的實現
根據上面的結構圖,我們可以實現如下代碼:
/**
* @description: 外觀類角色
* @author: wjw
* @date: 2022/4/1
*/
public class Facade {
private SubSystem1 subSystem1 = new SubSystem1();
private SubSystem2 subSystem2 = new SubSystem2();
private SubSystem3 subSystem3 = new SubSystem3();
public void show() {
System.out.println("我是Facade外觀類");
subSystem1.method1();
subSystem2.method2();
subSystem3.method3();
}
}
/**
* @description: 子系統1
* @author: wjw
* @date: 2022/4/1
*/
public class SubSystem1 {
public void method1() {
System.out.println("我是SubSystem1的method1方法");
}
}
/**
* @description: 子系統2
* @author: wjw
* @date: 2022/4/1
*/
public class SubSystem2 {
public void method2() {
System.out.println("我是SubSystem2的method2方法");
}
}
/**
* @description: 子系統3
* @author: wjw
* @date: 2022/4/1
*/
public class SubSystem3 {
public void method3() {
System.out.println("我是SubSystem3的method3方法");
}
}
/**
* @description: 客戶端類
* @author: wjw
* @date: 2022/4/1
*/
public class Client {
public static void main(String[] args) {
Facade facade = new Facade();
facade.show();
}
}
測試結果如下:
我是Facade外觀類
我是SubSystem1的method1方法
我是SubSystem2的method2方法
我是SubSystem3的method3方法
二、外觀模式的應用場景
2.1 slf4j中的應用
先舉個官網的例子來瞭解一下slf4j: 我們對Hello World
類進行日誌處理
首先在配置文件配置slf4j-api:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
然後在類中引入slf4j:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @description: 測試slf4j
* @author: wjw
* @date: 2022/4/1
*/
public class HelloWorld {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(HelloWorld.class);
logger.info("Hello world");
}
}
運行main方法我們發現得到這樣的結果:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
這是因為slf4j只是一個提供日誌介面的框架,不是完成日誌的具體實現。所以我們需要再配置一個具體日誌框架:
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.10</version>
</dependency>
再次運行成功:
09:21:38.507 [main] INFO cn.ethan.design.facade.HelloWorld - Hello world
再來看看官網中對於slf4j的介紹:
The Simple Logging Facade for Java (SLF4J) serves as a simple facade or abstraction for various logging frameworks, such as java.util.logging, logback and reload4j. SLF4J allows the end-user to plug in the desired logging framework at deployment time. Note that SLF4J-enabling your library/application implies the addition of only a single mandatory dependency, namely slf4j-api-1.7.36.jar.=
從名字The Simple Logging Facade Java 中的Facade我們可以知道,它就是外觀模式的應用。slf4j沒有替代任何日誌框架,它僅僅只是標準日誌框架的外觀模式,在需要使用具體的日誌框架,在配置文件加入即可:
參考資料
《重學Java設計模式》
http://c.biancheng.net/view/1369.html
https://www.cnblogs.com/xrq730/p/8619156.html