经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
设计模式-外观模式模式
来源:cnblogs  作者:fonxi  时间:2019/5/27 8:52:14  对本文有异议

外观模式(结构型模式)

  • 定义

外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易试用。[DP]

 

外观模式简单点说,就是通过外观类把所有的子系统类进行组合,供外部调用。

这样既不暴露内部,也降低了耦合。对照下面这张图能很好的理解外观模式(MVC三层架构就使用到了外观模式)

 


 

 

  • 特点
  1. 子系统不被直接调用
  2. 外观类去组合所有的子系统类实现,供外部使用。
  3. 外观类需要知道所有子系统

 

 

  • 结构

Client:外部调用类,客户端类

Facade:外观类

SubSystem Classes:子系统类


 

 

  • 代码

例子:启动电脑时,会启动CPU、硬盘、显卡。现在电脑类作为外观类,CPU、硬盘、显卡类作为子系统类,使用电脑的人作为客户端。客户端只允许电脑开机和电脑关机,CPU、硬盘、显卡的启动和停止交给电脑类(外观类)。

      子系统类集

  1. /**
  2. * @ Author :fonxi
  3. * @ Date :2019/5/24 12:38
  4. * @ Description:CPU
  5. */
  6. public class CPU {
  7. public void start(){
  8. System.out.println("CPU开始运行");
  9. }
  10.  
  11. public void stop(){
  12. System.out.println("CPU停止运行");
  13. }
  14. }

  

  1. /**
  2. * @ Author :fonxi
  3. * @ Date :2019/5/24 12:45
  4. * @ Description:硬盘
  5. */
  6. public class HardDisk {
  7. public void start(){
  8. System.out.println("硬盘开始运行");
  9. }
  10.  
  11. public void stop(){
  12. System.out.println("硬盘停止运行");
  13. }
  14. }

  

  1. /**
  2. * @ Author :fonxi
  3. * @ Date :2019/5/24 12:45
  4. * @ Description:显卡
  5. */
  6. public class GraphicsCard {
  7. public void start(){
  8. System.out.println("显卡开始运行");
  9. }
  10.  
  11. public void stop(){
  12. System.out.println("显卡停止运行");
  13. }
  14. }

  外观类

  1. /**
  2. * @ Author :fonxi
  3. * @ Date :2019/5/24 12:34
  4. * @ Description:外观类 电脑类
  5. */
  6. public class Facade {
  7.  
  8. private CPU cpu;
  9. private GraphicsCard graphicsCard;
  10. private HardDisk hardDisk;
  11.  
  12. public Facade(){
  13. cpu = new CPU();
  14. graphicsCard = new GraphicsCard();
  15. hardDisk = new HardDisk();
  16. }
  17.  
  18. //电脑开机
  19. public void startingUp(){
  20. cpu.start();
  21. graphicsCard.start();
  22. hardDisk.start();
  23. }
  24.  
  25. //电脑关机
  26. public void shutdown(){
  27. cpu.stop();
  28. graphicsCard.stop();
  29. hardDisk.stop();
  30. }
  31. }

  客户端调用类

  1. /**
  2. * @ Author :fonxi
  3. * @ Date :2019/5/24 12:33
  4. * @ Description:客户端调用类
  5. */
  6. public class TestController {
  7. public void print(){
  8. Facade facade = new Facade();
  9. System.out.println("开机");
  10. facade.startingUp();
  11. System.out.println("关机");
  12. facade.shutdown();
  13. }
  14. }

  输出结果

  1. 开机
  2. CPU开始运行
  3. 显卡开始运行
  4. 硬盘开始运行
  5. 关机
  6. CPU停止运行
  7. 显卡停止运行
  8. 硬盘停止运行

 很明显,客户端只进行了开关机,而子系统集的CPU、硬盘、显卡的启动和停止都是由外观类来完成的。


 

 

  • 使用场景
  1. 当子系统类需要很高的安全性,需要隐藏,不被其他人访问时。
  2. 当子系统类外部使用起来特别复杂时

 

 

  • 优缺点

优点:

  1. 内部隐藏,安全
  2. 内外部不直接访问,降低了耦合度
  3. 减少依赖,提高了灵活度

缺点:

  1. 违反开闭原则,外观类耦合,修改时麻烦
  2. 增加外观类,系统复杂性提升

 

 

  • 总结

外观模式减少外部与内部的交互,使系统松散耦合,外部调用简便。

原文链接:http://www.cnblogs.com/fonxi/p/10928546.html

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

本站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号