模式说明

当客户端需要通过调用多个对象各自不同的方法时,可以建立一个持有所有这些对象的外观类,根据客户端对上述多个对象的需要,外观类内有多个方法,这些方法内部调用多个不同对象的方法以满足客户端的不同需求。如此客户端就只需要调用外观类的方法,而无需访问多个对象。例如投资者买股票,投资者是客户端,不同公司的股票形成数量众多的对象。此时投资者可以通过基金经理来间接买股票,基金经理就是外观类,他通过不同的投资策略封装了多个股票的买入和卖出等方法,投资者只需要调用基金经理不同的策略方法即可,无需了解每一支股票。

本示例以上述投资者买股票场景为例,演示外观模式的使用。

结构

外观类
持有所有子系统的信息,并为客户端提供了一系列访问子系统的方法,这些方法内根据需要调用一个或多个子系统的方法。
子系统类
可以有多个子系统,每个子系统都有各自的方法。

代码演示

  1. package com.yukiyama.pattern.structure;
  2. /**
  3. * 外观模式
  4. */
  5. public class FacadeDemo {
  6. public static void main(String[] args) {
  7. // 声明一个外观类
  8. Fund f = new Fund();
  9. System.out.println("====执行基金策略1====");
  10. // 执行既定策略1
  11. f.strategy1();
  12. System.out.println("====执行基金策略2====");
  13. // 执行既定策略2
  14. f.strategy2();
  15. }
  16. }
  17. /**
  18. * 外观类
  19. * 下例为基金,持有三支股票对象,有两个策略方法,封装对三只股票的不同行为组合。
  20. */
  21. class Fund{
  22. private StockApple sa = new StockApple();
  23. private StockMaotai sm = new StockMaotai();
  24. private NationalDebt nd = new NationalDebt();
  25. public void strategy1() {
  26. sa.buy();
  27. sm.toYuebao();
  28. nd.sell();
  29. }
  30. public void strategy2() {
  31. sa.sell();
  32. sm.sell();
  33. nd.buy();
  34. }
  35. }
  36. /**
  37. * 子系统类
  38. * 苹果公司股票
  39. */
  40. class StockApple{
  41. public void sell() {
  42. System.out.println("卖出Apple股票");
  43. }
  44. public void buy() {
  45. System.out.println("买入Apple股票");
  46. }
  47. }
  48. /**
  49. * 子系统类
  50. * 茅台股票
  51. */
  52. class StockMaotai{
  53. public void toYuebao() {
  54. System.out.println("Maotai股票转入余额宝");
  55. }
  56. public void sell() {
  57. System.out.println("买入Maotai股票");
  58. }
  59. }
  60. /**
  61. * 子系统类
  62. * 国债
  63. */
  64. class NationalDebt{
  65. public void sell() {
  66. System.out.println("卖出国债");
  67. }
  68. public void buy() {
  69. System.out.println("买入国债");
  70. }
  71. }