大话设计模式笔记(九)の外观模式

举个栗子

问题描述

股民炒股票

简单实现

股票1

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

其他股票

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

测试

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

测试结果

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

外观模式

定义

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

UML图

代码实现

基金类(Facade)

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

测试

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

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

总结

  • 首先,在设计初期阶段,应该要有意识的将不同的两个层分离,层与层之间建立外观 Facade;
  • 其次,在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,增加外观 Facade 可以提供一个简单的接口,减少它们之间的依赖;
  • 第三,在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,为新系统开发一个外观 Facade 类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与 Facade 对象交互,Facade 与遗留代码交互所有复杂的工作
posted @   callmeDevil  阅读(366)  评论(0编辑  收藏  举报
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥
点击右上角即可分享
微信分享提示