经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
大话设计模式笔记(九)の外观模式
来源:cnblogs  作者:callmeDevil  时间:2019/7/22 10:48:56  对本文有异议

举个栗子

问题描述

股民炒股票

简单实现

股票1

  1. /**
  2. * 股票1
  3. * Created by callmeDevil on 2019/7/20.
  4. */
  5. public class Stock1 {
  6. public void sell() {
  7. System.out.println("股票1卖出");
  8. }
  9. public void buy() {
  10. System.out.println("股票1买入");
  11. }
  12. }

其他股票

  1. /**
  2. * 股票2
  3. * Created by callmeDevil on 2019/7/20.
  4. */
  5. public class Stock2 {
  6. // 代码与股票1类似
  7. }
  8. /**
  9. * 股票3
  10. * Created by callmeDevil on 2019/7/20.
  11. */
  12. public class Stock3 {
  13. // 代码与股票1类似
  14. }
  15. /**
  16. * 国债1
  17. * Created by callmeDevil on 2019/7/20.
  18. */
  19. public class NationalDebt1 {
  20. // 代码与股票1类似
  21. }
  22. /**
  23. * 房地产1
  24. * Created by callmeDevil on 2019/7/20.
  25. */
  26. public class Realty1 {
  27. // 代码与股票1类似
  28. }

测试

  1. /**
  2. * 炒股测试
  3. * Created by callmeDevil on 2019/7/20.
  4. */
  5. public class Test {
  6. public static void main(String[] args) {
  7. Stock1 stock1 = new Stock1();
  8. Stock2 stock2 = new Stock2();
  9. Stock3 stock3 = new Stock3();
  10. NationalDebt1 debt1 = new NationalDebt1();
  11. Realty1 realty1 = new Realty1();
  12. // 用户需要了解股票、国债、房地产情况,需要参与这些项目的具体买卖,耦合性很高
  13. stock1.buy();
  14. stock2.buy();
  15. stock3.buy();
  16. debt1.buy();
  17. realty1.buy();
  18. stock1.sell();
  19. stock2.sell();
  20. stock3.sell();
  21. debt1.sell();
  22. realty1.sell();
  23. }
  24. }

测试结果

  1. 股票1买入
  2. 股票2买入
  3. 股票3买入
  4. 国债1买入
  5. 房地产1买入
  6. 股票1卖出
  7. 股票2卖出
  8. 股票3卖出
  9. 国债1卖出
  10. 房地产1卖出

外观模式

定义

为了子系统中的一组接口提供一个一致的界面,此模式定义了一个高层的接口,这个接口使得这个子系统更加容易使用。

UML图

代码实现

基金类(Facade)

  1. /**
  2. * 基金类(Facade)
  3. * Created by callmeDevil on 2019/7/20.
  4. */
  5. public class Fund {
  6. private Stock1 stock1;
  7. private Stock2 stock2;
  8. private Stock3 stock3;
  9. private NationalDebt1 debt1;
  10. private Realty1 realty1;
  11. public Fund(){
  12. stock1 = new Stock1();
  13. stock2 = new Stock2();
  14. stock3 = new Stock3();
  15. debt1 = new NationalDebt1();
  16. realty1 = new Realty1();
  17. }
  18. // 买基金
  19. public void buyFund(){
  20. stock1.buy();
  21. stock2.buy();
  22. stock3.buy();
  23. debt1.buy();
  24. realty1.buy();
  25. }
  26. // 卖基金
  27. public void sellFund(){
  28. stock1.sell();
  29. stock2.sell();
  30. stock3.sell();
  31. debt1.sell();
  32. realty1.sell();
  33. }
  34. }

测试

  1. /**
  2. * 基金测试(外观模式)
  3. * Created by callmeDevil on 2019/7/20.
  4. */
  5. public class Test {
  6. public static void main(String[] args) {
  7. // 此时用户不需要了解股票,甚至可以对股票一无所知,买了基金就回家睡觉
  8. // 一段时间后再赎回就可以大把数钱,参与股票的具体买卖都有基金公司完成
  9. // 客户端代码非常简洁明了
  10. Fund fund = new Fund();
  11. // 购买基金
  12. fund.buyFund();
  13. // 基金赎回
  14. fund.sellFund();
  15. }
  16. }

测试结果同上,此处省略。

总结

  • 首先,在设计初期阶段,应该要有意识的将不同的两个层分离,层与层之间建立外观 Facade;
  • 其次,在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,增加外观 Facade 可以提供一个简单的接口,减少它们之间的依赖;
  • 第三,在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,为新系统开发一个外观 Facade 类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与 Facade 对象交互,Facade 与遗留代码交互所有复杂的工作

原文链接:http://www.cnblogs.com/call-me-devil/p/11217645.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号