三層模式開發中體現的外觀模式你看出來了嗎?

外觀模式

今天我們講解的是23種設計模式中的第十種——外觀模式。外觀模式主要通過向現有的系統添加一個接口,來隱藏系統的複雜性。

概念:

外觀模式是一種通過爲多個複雜的子系統提供一個一致的接口,而使這些子系統更加容易被訪問的模式。該模式對外有一個統一接口,外部應用程序不用關心內部子系統的具體的細節,這樣會大大降低應用程序的複雜度,提高了程序的可維護性。

特點:

優點:

  • 降低了子系統與客戶端之間的耦合度,使得子系統的變化不會影響調用它的客戶類。

  • 對客戶屏蔽了子系統組件,減少了客戶處理的對象數目,並使得子系統使用起來更加容易。

  • 降低了大型軟件系統中的編譯依賴性,簡化了系統在不同平臺之間的移植過程,因爲編譯一個子系統不會影響其他的子系統,也不會影響外觀對象。

缺點:

  • 增加新的子系統可能需要修改外觀類或客戶端的源代碼,違背了“開閉原則”。
類圖分析:

image-20200425150656606

代碼:

影院燈光

package cn.ppdxzz.facade;

/**
 * Description:影院燈光
 * @Author: PeiChen JavaAnything
 */
public class TheaterLight {
    private static final TheaterLight INSTANCE = new TheaterLight();
    public static TheaterLight getInstance() {
        return INSTANCE;
    }
    public void on() {
        System.out.println("燈光開啓");
    }
    public void off() {
        System.out.println("燈光關閉");
    }
    public void dim() {
        System.out.println("燈光變暗...");
    }
    public void bright() {
        System.out.println("燈光變亮...");
    }

}

爆米花

package cn.ppdxzz.facade;

/**
 * Description:爆米花
 * @Author: PeiChen JavaAnything
 */
public class Popcorn {
    private static final Popcorn INSTANCE = new Popcorn();
    public static Popcorn getInstance() {
        return INSTANCE;
    }
    public void on() {
        System.out.println("爆米花開始");
    }
    public void off() {
        System.out.println("爆米花結束");
    }
    public void pop() {
        System.out.println("正在爆爆米花...");
    }
}

屏幕

package cn.ppdxzz.facade;
/**
 * Description:屏幕
 * @Author: PeiChen JavaAnything
 */
public class Screen {
    private static final Screen INSTANCE = new Screen();
    public static Screen getInstance() {
        return INSTANCE;
    }
    public void up() {
        System.out.println("屏幕上拉");
    }
    public void down() {
        System.out.println("屏幕下拉");
    }
}

投影儀

package cn.ppdxzz.facade;

/**
 * Description:投影儀
 * @Author: PeiChen JavaAnything
 */
public class Projector {
    private static final Projector INSTANCE = new Projector();
    public static Projector getInstance() {
        return INSTANCE;
    }

    public void on() {
        System.out.println("投影儀開啓");
    }
    public void off() {
        System.out.println("投影儀關閉");
    }
    public void focus() {
        System.out.println("投影儀正在投影...");
    }
}

立體聲

package cn.ppdxzz.facade;

/**
 * Description:立體聲
 * @Author: PeiChen JavaAnything
 */
public class Stereo {
    private static final Stereo INSTANCE = new Stereo();

    public static Stereo getInstance() {
        return INSTANCE;
    }

    public void on() {
        System.out.println("立體聲開啓");
    }

    public void off() {
        System.out.println("立體聲關閉");
    }
}

客戶端

package cn.ppdxzz.facade;

/**
 * Description:外觀模式家庭電影院
 * @Author: PeiChen JavaAnything
 */
public class Client {
    public static void main(String[] args) {
        HomeTheater homeTheater = new HomeTheater();
        homeTheater.ready();
        homeTheater.play();
        homeTheater.pauseIng();
        homeTheater.end();
    }
}

運行演示:

image-20200425145827951

總結:
  • 外觀模式對外屏蔽了子系統的細節,因此外觀模式降低了客戶端對子系統使用的複雜性。
  • 當系統需要進行分層設計時,可以考慮使用 Facade 模式。

Java 體系的三層開發模式就是使用的這種外觀模式的思想,這種設計模式還是非常有必要學習一下它的思想的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章