首頁 > 軟體

Java設計模式之外觀模式範例詳解

2022-03-02 19:01:37

定義

外觀模式為多個複雜的子系統,提供了一個一致的介面,使得呼叫端只和這個介面發生呼叫,而無須關係這個子系統內部的細節

案例

需求

看電影的時候需要進行一系列的操作,比如開啟播放器,放下螢幕,開啟投影儀,開啟音響等,這個要怎麼進行管理呢

方案:外觀模式實現

定義播放器類

public class Player {

    private static Player player = new Player();

    private Player(){}

    public static Player getInstance(){

        return player;
    }

    public void on(){
        System.out.println("開啟播放器");
    }

    public void off(){
        System.out.println("關閉播放器");
    }

    public void play(){
        System.out.println("使用播放器播放電影");
    }

    public void pause(){
        System.out.println("暫停播放器");
    }

    public void select(){
        System.out.println("選擇喜歡的電影");
    }
}

定義投影儀類

public class Projector {

    private static Projector projector = new Projector();

    private Projector(){}

    public static Projector getInstance(){

        return projector;
    }

    public void on(){
        System.out.println("放下螢幕,開啟投影儀");
    }

    public void off(){
        System.out.println("關閉投影儀");
    }

    public void focus(){
        System.out.println("調節投影儀焦距");
    }

    public void zoom(){
        System.out.println("投影儀變焦");
    }

}

定義音響類

public class Stereo {

    private static Stereo stereo = new Stereo();

    private Stereo(){}

    public static Stereo getInstance(){
        return stereo;
    }

    public void on(){
        System.out.println("開啟音響");
    }

    public void off(){
        System.out.println("關閉音響");
    }

    public void setVolume(){
        System.out.println("調節音響音量");
    }
}

定義爆米花機類

/**
 * 爆米花機
 * @author:liyajie
 * @createTime:2022/3/2 14:24
 * @version:1.0
 */
public class Popcorn {

    private static Popcorn popcorn = new Popcorn();

    private Popcorn(){}

    public static Popcorn getInstance(){
        return popcorn;
    }

    public void on(){
        System.out.println("開啟爆米花機");
    }

    public void off(){
        System.out.println("關閉爆米花機");
    }

    public void pop(){
        System.out.println("製作爆米花");
    }
}

定義家庭影院外觀類

public class HomeTheaterFacade {

    // 聚合各個子系統
    private Player player;

    private Popcorn popcorn;

    private Projector projector;

    private Stereo stereo;

    public HomeTheaterFacade(){

    }

    // 全參構造器
    public HomeTheaterFacade(Player player, Popcorn popcorn,Projector projector,Stereo stereo){
        this.player = player;
        this.popcorn = popcorn;
        this.projector = projector;
        this.stereo = stereo;
    }

    // 準備階段
    public void ready(){
        popcorn.on();
        player.on();
        projector.on();
        stereo.on();
    }

    // 播放
    public void play(){
        player.select();
        popcorn.pop();
        projector.focus();
        stereo.setVolume();
    }

    // 結束
    public void end(){
        player.off();
        popcorn.off();
        projector.off();
        stereo.off();
    }
}

定義測試類

public class Test {
    public static void main(String[] args) {
        HomeTheaterFacade homeTheaterFacade = new HomeTheaterFacade(Player.getInstance(),Popcorn.getInstance(),Projector.getInstance(),Stereo.getInstance());
        homeTheaterFacade.ready();
        homeTheaterFacade.play();
        homeTheaterFacade.end();
    }
}

檢視測試結果

分析

我們通過家庭影院外觀類HomeTheaterFacade的ready,play,end方法操作了播放器,投影儀等的開啟,關閉,對於家庭影院外觀類來說,他是不需要知道播放器,投影儀等的開啟,關閉具體是怎麼樣實現的。在一定程度上實現瞭解耦,易維護和擴充套件。

總結

優勢:

1.外觀模式對外遮蔽了子系統的實現細節(安全性)

2.外觀模式降低了使用者端與子系統互動的複雜性,對使用者端和子系統進行解耦合,子系統內部的模組更容易維護和擴充套件

3.通過合理的使用外觀模式,可以幫助我們更好的劃分存取層次

使用場景

1.對分層的系統進行構建時,使用外觀模式可以簡化子系統之間的依賴關係

2.當有一個複雜的系統,裡面有很多子系統,有大量的操作,這時候可以使用外觀模式

3.當用戶端與多個子系統之間存在很多耦合時,引入外觀模式,可以將他們分離,提高子系統的獨立性和可移植性

以上就是Java設計模式之外觀模式範例詳解的詳細內容,更多關於Java外觀模式的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com