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

定義

外觀模式為多個復雜的子系統,提供瞭一個一致的界面,使得調用端隻和這個接口發生調用,而無須關系這個子系統內部的細節

案例

需求

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

方案:外觀模式實現

定義播放器類

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外觀模式的資料請關註WalkonNet其它相關文章!

推薦閱讀: