信息发布→ 登录 注册 退出

Java设计模式之外观模式示例详解

发布时间:2026-01-11

点击量:
目录
  • 定义
  • 案例
    • 需求
    • 方案:外观模式实现
  • 分析
    • 总结

      定义

      外观模式为多个复杂的子系统,提供了一个一致的界面,使得调用端只和这个接口发生调用,而无须关系这个子系统内部的细节

      案例

      需求

      看电影的时候需要进行一系列的操作,比如打开播放器,放下屏幕,打开投影仪,打开音响等,这个要怎么进行管理呢

      方案:外观模式实现

      定义播放器类

      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:2025/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外观模式的资料请关注其它相关文章!

      在线客服
      服务热线

      服务热线

      4008888355

      微信咨询
      二维码
      返回顶部
      ×二维码

      截屏,微信识别二维码

      打开微信

      微信号已复制,请打开微信添加咨询详情!