1. 程式人生 > >設計模式-外觀(門面)模式

設計模式-外觀(門面)模式

文章目錄

外觀模式介紹

外觀模式,也成為門面模式,它隱藏了系統的複雜性,並向客戶端提供了一個可以訪問系統的介面。

適用方要完成一個功能,需要呼叫提供方的多個介面、方法,呼叫過程複雜時,我們可以再提供一個高層介面(新的外觀),將複雜的呼叫過程向適用方隱藏。

演變方式:
在這裡插入圖片描述
簡單來說,該模式就是把一些複雜的流程封裝成一個介面供給外部使用者更簡單的使用。這個模式中,設計到3個角色。

  • 門面角色:外觀模式的核心。它被客戶角色呼叫,它熟悉子系統的功能。內部根據客戶角色的需求預定了幾種功能的組合。
  • 子系統角色:實現了子系統的功能。它對客戶角色和Facade時未知的。它內部可以有系統內的相互互動,也可以由供外界呼叫的介面。
  • 客戶角色:通過呼叫Facede來完成要實現的功能

使用場景

  • 為複雜的模組或子系統提供外界訪問的模組;
  • 子系統相互獨立;
  • 在層析結構中,可以使用外觀模式定義系統的每一層的入口

程式碼例項

舉一個電腦啟動,內部各子系統如CPU、磁碟、記憶體也會跟隨著一起啟動的例子。
首先是各個子系統:

public class CPU {

    public void start() {
        System.
out.println("cpu is start..."); } public void shutdown() { System.out.println("cpu is shutdown..."); } }
public class Disk {

    public void start() {
        System.out.println("disk is start...");
    }

    public void shutdown() {
        System.out.println("disk is shutdown..."
); } }
public class Memory {

    public void start() {
        System.out.println("memory is start...");
    }

    public void shutdown() {
        System.out.println("memory is shutdown...");
    }
}

然後是門面類,Computer:

public class Computer {
    private CPU cpu;
    private Disk disk;
    private Memory memory;

    public Computer() {
        cpu = new CPU();
        disk = new Disk();
        memory = new Memory();
    }

    public void start() {
        System.out.println("computer start begin");
        cpu.start();
        disk.start();
        memory.start();
        System.out.println("computer start end");
    }

    public void shutdown() {
        System.out.println("computer shutdown begin");
        cpu.shutdown();
        disk.shutdown();
        memory.shutdown();
        System.out.println("computer shutdown end");
    }
}

然後是客戶端呼叫:

public class ClientMain {
    public static void main(String[] args) {
        Computer computer = new Computer();
        computer.start();
        computer.shutdown();
    }
}

從上面的例項來看,有了這個Facade類,也就是Computer類,使用者就不用親自去呼叫子系統中的Disk,Memory、CPU類了,不需要知道系統內部的實現細節,甚至都不用知道系統內部的構成。客戶端只需要跟Facade互動就可以了

總結

優點

  • 鬆散耦合:使得客戶端和子系統之間解耦,讓子系統內部的模組功能更容易擴充套件和維護
  • 簡單易用:客戶端根本不需要知道子系統內部的實現,或者根本不需要知道子系統內部的構成,它只需要跟Facade類互動即可
  • 更好的劃分訪問層次:有些方法是對系統外的,有些方法是系統內部相互互動的使用的。子系統把那些暴露給外部的功能集中到門面中,這樣就可以實現客戶端的使用,很好的隱藏了子系統內部的細節