概念:

    • ①:外观模式(Facade),也叫(门面模式):为子系统中的一组接口,提供一个一致的界面。此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
    • ②:外观模式提供的高层接口,用以屏蔽内部子系统的细节,使得调用端只需要跟这个接口发生调用,而无需关心这个子系统的内部细节,简化操作流程。
    • ③:外观模式提供的高层接口,知道那些子系统负责处理什么请求,从而将调用端的请求代理给适当子系统对象。
    • ④:各个不同的子系统模块,它们是功能的提供者,处理高层接口对象指派的任务。

    外观模式 - 图1

    电影播放器设备,具有 开、关、播放、暂停的功能

    1. /*电影播放器*/
    2. public class MoviePlayer {
    3. private static final MoviePlayer INSTANCE = new MoviePlayer();
    4. private MoviePlayer() {
    5. }
    6. public static MoviePlayer getInstance() {
    7. return INSTANCE;
    8. }
    9. public void on() {
    10. System.out.println("打开MoviePlayer……");
    11. }
    12. public void off() {
    13. System.out.println("关闭MoviePlayer……");
    14. }
    15. public void pause() {
    16. System.out.println("`MoviePlayer`,暂停电影播放……");
    17. }
    18. public void play() {
    19. System.out.println("`MoviePlayer`,播放电影中……");
    20. }
    21. }

    投影仪设备,具有 开、关、播放的功能

    1. /*投影仪*/
    2. public class Projector {
    3. private static final Projector INSTANCE = new Projector();
    4. private Projector() {
    5. }
    6. public static Projector getInstance() {
    7. return INSTANCE;
    8. }
    9. public void on() {
    10. System.out.println("打开投影仪幕布……");
    11. }
    12. public void off() {
    13. System.out.println("关闭投影仪幕布……");
    14. }
    15. public void play() {
    16. System.out.println("连接到`MoviePlayer`,播放画面……");
    17. }
    18. }

    投影仪幕布设备,具有 开、关 的功能

    1. /*投影仪幕布*/
    2. public class Screen {
    3. private static final Screen INSTANCE = new Screen();
    4. private Screen() {
    5. }
    6. public static Screen getInstance() {
    7. return INSTANCE;
    8. }
    9. public void on() {
    10. System.out.println("打开投影仪幕布……");
    11. }
    12. public void off() {
    13. System.out.println("关闭投影仪幕布……");
    14. }
    15. }

    立体声音箱设备,具有 开、关、播放、声音高低 的功能

    1. /*立体声音箱*/
    2. public class Stereo {
    3. private static final Stereo INSTANCE = new Stereo();
    4. private Stereo() {
    5. }
    6. public static Stereo getInstance() {
    7. return INSTANCE;
    8. }
    9. public void on() {
    10. System.out.println("打开音响……");
    11. }
    12. public void off() {
    13. System.out.println("关闭音响……");
    14. }
    15. public void volumeUp() {
    16. System.out.println("音响声音提高……");
    17. }
    18. public void volumeDown() {
    19. System.out.println("音响声音降低……");
    20. }
    21. public void play() {
    22. System.out.println("连接到`MoviePlayer`,播放声音……");
    23. }
    24. }

    灯光设备,具有 开、关 的功能

    1. /*灯光*/
    2. public class Light {
    3. private static final Light INSTANCE = new Light();
    4. private Light() {
    5. }
    6. public static Light getInstance() {
    7. return INSTANCE;
    8. }
    9. public void on() {
    10. System.out.println("打开灯光……");
    11. }
    12. public void off() {
    13. System.out.println("关闭灯光……");
    14. }
    15. }

    提供一个HomeTheatre(家庭影院)的高层接口,用以屏蔽内部子系统的细节,使得调用端只需要跟这个接口发生调用,而无需关心这个子系统的内部细节,简化操作流程。

    1. /*家庭影院*/
    2. public class HomeTheatre {
    3. private MoviePlayer moviePlayer;
    4. private Projector projector;
    5. private Screen screen;
    6. private Stereo stereo;
    7. private Light light;
    8. public HomeTheatre() {
    9. this.moviePlayer = MoviePlayer.getInstance();
    10. this.projector = Projector.getInstance();
    11. this.screen = Screen.getInstance();
    12. this.stereo = Stereo.getInstance();
    13. this.light = Light.getInstance();
    14. }
    15. public void on() {
    16. moviePlayer.on();
    17. projector.on();
    18. screen.on();
    19. stereo.on();
    20. light.on();
    21. }
    22. public void off() {
    23. moviePlayer.off();
    24. projector.off();
    25. screen.off();
    26. stereo.off();
    27. light.off();
    28. }
    29. public void pause() {
    30. moviePlayer.pause();
    31. }
    32. public void play() {
    33. moviePlayer.play();
    34. projector.play();
    35. stereo.play();
    36. }
    37. public void volumeUp() {
    38. stereo.volumeUp();
    39. }
    40. public void volumeDown() {
    41. stereo.volumeDown();
    42. }
    43. }

    用户通过遥控器来操控,家庭影院的 开、关、播放、声音高低、暂停 等等。

    1. /*遥控器操控*/
    2. public class RemoteControl {
    3. public static void main(String[] args) {
    4. HomeTheatre homeTheatre = new HomeTheatre();
    5. homeTheatre.on();
    6. homeTheatre.play();
    7. homeTheatre.volumeUp();
    8. homeTheatre.volumeDown();
    9. homeTheatre.pause();
    10. homeTheatre.off();
    11. }
    12. }

    内容输出:

    1. 打开MoviePlayer……
    2. 打开投影仪幕布……
    3. 打开投影仪幕布……
    4. 打开音响……
    5. 打开灯光……
    6. `MoviePlayer`,播放电影中……
    7. 连接到`MoviePlayer`,播放画面……
    8. 连接到`MoviePlayer`,播放声音……
    9. 音响声音提高……
    10. 音响声音降低……
    11. `MoviePlayer`,暂停电影播放……
    12. 关闭MoviePlayer……
    13. 关闭投影仪幕布……
    14. 关闭投影仪幕布……
    15. 关闭音响……
    16. 关闭灯光……