Java設(shè)計模式之—外觀模式
外觀模式是一種軟件設(shè)計模式,它為復(fù)雜的子系統(tǒng)提供了一個統(tǒng)一的接口,使得這些子系統(tǒng)更加容易被訪問或使用。它的主要目標是提供一個高層次的接口,隱藏子系統(tǒng)的復(fù)雜性。
主要解決什么問題
外觀模式主要解決的是子系統(tǒng)與客戶端之間的緊耦合問題,使得客戶端可以更簡單地調(diào)用子系統(tǒng)的功能,而不需要關(guān)心子系統(tǒng)內(nèi)部的復(fù)雜實現(xiàn)細節(jié)。
在什么時候我們需要使用外觀模式
當我們要為一個復(fù)雜的子系統(tǒng)提供一個簡單的接口時,或者當我們要解耦子系統(tǒng)與其客戶端之間的關(guān)系時,我們需要使用外觀模式。
生活中的應(yīng)用實例
假設(shè)你到了一個新城市,你可能需要使用各種服務(wù),比如餐飲、住宿、交通等。你可以選擇自己去找各個服務(wù)提供者,這就像直接使用子系統(tǒng)。但如果有一個旅行代理(外觀)提供了所有這些服務(wù)的接入點,你只需要和旅行代理打交道,就可以得到你需要的所有服務(wù),這會使你的生活更加簡單。
優(yōu)點
對客戶端屏蔽子系統(tǒng)組件,減少了客戶處理的對象數(shù)目并使子系統(tǒng)使用起來更容易。
實現(xiàn)了子系統(tǒng)與客戶端之間的松耦合關(guān)系。
缺點
不符合開閉原則,如果業(yè)務(wù)復(fù)雜則會導(dǎo)致類的數(shù)量增多,增加了系統(tǒng)的復(fù)雜性。
如果不正確或過度使用外觀模式,可能會導(dǎo)致系統(tǒng)的設(shè)計變得復(fù)雜或難以理解。
使用場景
當需要為一個復(fù)雜的子系統(tǒng)提供一個簡單的接口時。
客戶端與子系統(tǒng)之間存在很多依賴時。
代碼示例
假設(shè)我們有一個復(fù)雜的電腦系統(tǒng),包括CPU、內(nèi)存和硬盤三個子系統(tǒng)。我們可以創(chuàng)建一個外觀類來簡化與這些子系統(tǒng)的交互。
//子系統(tǒng)
class CPU {
? ? public void start() {
? ? ? ? System.out.println("CPU is start...");
? ? }
}
class Memory {
? ? public void start() {
? ? ? ? System.out.println("Memory is start...");
? ? }
}
class Disk {
? ? public void start() {
? ? ? ? System.out.println("Disk is start...");
? ? }
}
//外觀類
class Computer {
? ? private CPU cpu;
? ? private Memory memory;
? ? private Disk disk;
? ??
? ? public Computer(){
? ? ? ? cpu = new CPU();
? ? ? ? memory = new Memory();
? ? ? ? disk = new Disk();
? ? }
? ??
? ? public void start() {
? ? ? ? System.out.println("Computer start begin");
? ? ? ? cpu.start();
? ? ? ? memory.start();
? ? ? ? disk.start();
? ? ? ? System.out.println("Computer start end");
? ? }
}
//客戶端
public class FacadePatternDemo {
? ? public static void main(String[] args) {
? ? ? ? Computer computer = new Computer();
? ? ? ? computer.start();
? ? }
}
在這個示例中,我們創(chuàng)建了一個Computer類作為外觀,提供了一個start方法,將啟動電腦的復(fù)雜過程封裝起來。客戶端只需要調(diào)用這個方法,就可以啟動電腦,不需要關(guān)心具體的實現(xiàn)細節(jié)。