定义外观模式是软件工程中常用的一种软件设计模式。它为子系统中的一组接口提供一个统一的高层接口。这一接口使得子系统更加容易使用。
    相比起观察者模式,适配器模式等适合小规模使用的设计模式,外观模式更多的是大范围的使用,它会是很多时候支撑我们整个架构的设计思路。
    1,实际使用当中,接口并不是必须的,虽说根据依赖倒置原则,无论是处于高层的外观层,还是处于底层的子系统,都应该依赖于抽象,但是这会倒置子系统的每一个实现都要对应一个接口,从而导致系统的复杂性增加,所以这样做并不是必须的。

    2,外观接口当中并不一定是子系统中某几个功能的组合,也可以是将子系统中某一个接口的某一功能单独暴露给客户端。

    3,外观接口如果需要暴露给客户端很多的功能的话,可以将外观接口拆分为若干个外观接口,如此便会形成一层外观层。

    1. package com.facade;
    2. public interface Sub1 {
    3. void function1();
    4. }
    5. package com.facade;
    6. public interface Sub2 {
    7. void function2();
    8. }
    9. package com.facade;
    10. public interface Sub3 {
    11. void function3();
    12. }
    13. package com.facade;
    14. public class Sub1Impl implements Sub1{
    15. public void function1() {
    16. System.out.println("子系统中Sub1接口的功能");
    17. }
    18. }
    19. package com.facade;
    20. public class Sub2Impl implements Sub2{
    21. public void function2() {
    22. System.out.println("子系统中Sub2接口的功能");
    23. }
    24. }
    25. package com.facade;
    26. public class Sub3Impl implements Sub3{
    27. public void function3() {
    28. System.out.println("子系统中Sub3接口的功能");
    29. }
    30. }
    31. package com.facade;
    32. public interface Facade {
    33. /* 下面随便组装几个功能 */
    34. void function12();
    35. void function23();
    36. void function123();
    37. }
    38. package com.facade;
    39. public class FacadeImpl implements Facade{
    40. private Sub1 sub1;
    41. private Sub2 sub2;
    42. private Sub3 sub3;
    43. public FacadeImpl() {
    44. super();
    45. this.sub1 = new Sub1Impl();
    46. this.sub2 = new Sub2Impl();
    47. this.sub3 = new Sub3Impl();
    48. }
    49. public FacadeImpl(Sub1 sub1, Sub2 sub2, Sub3 sub3) {
    50. super();
    51. this.sub1 = sub1;
    52. this.sub2 = sub2;
    53. this.sub3 = sub3;
    54. }
    55. public void function12() {
    56. sub1.function1();
    57. sub2.function2();
    58. }
    59. public void function23() {
    60. sub2.function2();
    61. sub3.function3();
    62. }
    63. public void function123() {
    64. sub1.function1();
    65. sub2.function2();
    66. sub3.function3();
    67. }
    68. }
    69. package com.facade;
    70. public class Client {
    71. public static void main(String[] args) {
    72. Facade facade = new FacadeImpl();
    73. facade.function12();
    74. System.out.println("-------------------------");
    75. facade.function23();
    76. System.out.println("-------------------------");
    77. facade.function123();
    78. /* 以上为使用了外观模式的调用方式,以下为原始方式 */
    79. System.out.println("-------------以下原始方式--------------");
    80. Sub1 sub1 = new Sub1Impl();
    81. Sub2 sub2 = new Sub2Impl();
    82. Sub3 sub3 = new Sub3Impl();
    83. sub1.function1();
    84. sub2.function2();
    85. System.out.println("-------------------------");
    86. sub2.function2();
    87. sub3.function3();
    88. System.out.println("-------------------------");
    89. sub1.function1();
    90. sub2.function2();
    91. sub3.function3();
    92. }
    93. }