经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
Java设计模式之外观模式示例详解
来源:jb51  时间:2022/3/2 17:43:47  对本文有异议

定义

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

案例

需求

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

方案:外观模式实现

定义播放器类

  1. public class Player {
  2.  
  3. private static Player player = new Player();
  4.  
  5. private Player(){}
  6.  
  7. public static Player getInstance(){
  8.  
  9. return player;
  10. }
  11.  
  12. public void on(){
  13. System.out.println("打开播放器");
  14. }
  15.  
  16. public void off(){
  17. System.out.println("关闭播放器");
  18. }
  19.  
  20. public void play(){
  21. System.out.println("使用播放器播放电影");
  22. }
  23.  
  24. public void pause(){
  25. System.out.println("暂停播放器");
  26. }
  27.  
  28. public void select(){
  29. System.out.println("选择喜欢的电影");
  30. }
  31. }

定义投影仪类

  1. public class Projector {
  2.  
  3. private static Projector projector = new Projector();
  4.  
  5. private Projector(){}
  6.  
  7. public static Projector getInstance(){
  8.  
  9. return projector;
  10. }
  11.  
  12. public void on(){
  13. System.out.println("放下屏幕,打开投影仪");
  14. }
  15.  
  16. public void off(){
  17. System.out.println("关闭投影仪");
  18. }
  19.  
  20. public void focus(){
  21. System.out.println("调节投影仪焦距");
  22. }
  23.  
  24. public void zoom(){
  25. System.out.println("投影仪变焦");
  26. }
  27.  
  28. }

定义音响类

  1. public class Stereo {
  2.  
  3. private static Stereo stereo = new Stereo();
  4.  
  5. private Stereo(){}
  6.  
  7. public static Stereo getInstance(){
  8. return stereo;
  9. }
  10.  
  11. public void on(){
  12. System.out.println("打开音响");
  13. }
  14.  
  15. public void off(){
  16. System.out.println("关闭音响");
  17. }
  18.  
  19. public void setVolume(){
  20. System.out.println("调节音响音量");
  21. }
  22. }

定义爆米花机类

  1. /**
  2. * 爆米花机
  3. * @author:liyajie
  4. * @createTime:2022/3/2 14:24
  5. * @version:1.0
  6. */
  7. public class Popcorn {
  8.  
  9. private static Popcorn popcorn = new Popcorn();
  10.  
  11. private Popcorn(){}
  12.  
  13. public static Popcorn getInstance(){
  14. return popcorn;
  15. }
  16.  
  17. public void on(){
  18. System.out.println("打开爆米花机");
  19. }
  20.  
  21. public void off(){
  22. System.out.println("关闭爆米花机");
  23. }
  24.  
  25. public void pop(){
  26. System.out.println("制作爆米花");
  27. }
  28. }

定义家庭影院外观类

  1. public class HomeTheaterFacade {
  2.  
  3. // 聚合各个子系统
  4. private Player player;
  5.  
  6. private Popcorn popcorn;
  7.  
  8. private Projector projector;
  9.  
  10. private Stereo stereo;
  11.  
  12. public HomeTheaterFacade(){
  13.  
  14. }
  15.  
  16. // 全参构造器
  17. public HomeTheaterFacade(Player player, Popcorn popcorn,Projector projector,Stereo stereo){
  18. this.player = player;
  19. this.popcorn = popcorn;
  20. this.projector = projector;
  21. this.stereo = stereo;
  22. }
  23.  
  24. // 准备阶段
  25. public void ready(){
  26. popcorn.on();
  27. player.on();
  28. projector.on();
  29. stereo.on();
  30. }
  31.  
  32. // 播放
  33. public void play(){
  34. player.select();
  35. popcorn.pop();
  36. projector.focus();
  37. stereo.setVolume();
  38. }
  39.  
  40. // 结束
  41. public void end(){
  42. player.off();
  43. popcorn.off();
  44. projector.off();
  45. stereo.off();
  46. }
  47. }

定义测试类

  1. public class Test {
  2. public static void main(String[] args) {
  3. HomeTheaterFacade homeTheaterFacade = new HomeTheaterFacade(Player.getInstance(),Popcorn.getInstance(),Projector.getInstance(),Stereo.getInstance());
  4. homeTheaterFacade.ready();
  5. homeTheaterFacade.play();
  6. homeTheaterFacade.end();
  7. }
  8. }

查看测试结果

分析

我们通过家庭影院外观类HomeTheaterFacade的ready,play,end方法操作了播放器,投影仪等的打开,关闭,对于家庭影院外观类来说,他是不需要知道播放器,投影仪等的打开,关闭具体是怎么样实现的。在一定程度上实现了解耦,易维护和扩展。

总结

优势:

1.外观模式对外屏蔽了子系统的实现细节(安全性)

2.外观模式降低了客户端与子系统交互的复杂性,对客户端和子系统进行解耦合,子系统内部的模块更容易维护和扩展

3.通过合理的使用外观模式,可以帮助我们更好的划分访问层次

使用场景

1.对分层的系统进行构建时,使用外观模式可以简化子系统之间的依赖关系

2.当有一个复杂的系统,里面有很多子系统,有大量的操作,这时候可以使用外观模式

3.当客户端与多个子系统之间存在很多耦合时,引入外观模式,可以将他们分离,提高子系统的独立性和可移植性

以上就是Java设计模式之外观模式示例详解的详细内容,更多关于Java外观模式的资料请关注w3xue其它相关文章!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号