定义外观模式是软件工程中常用的一种软件设计模式。它为子系统中的一组接口提供一个统一的高层接口。这一接口使得子系统更加容易使用。
相比起观察者模式,适配器模式等适合小规模使用的设计模式,外观模式更多的是大范围的使用,它会是很多时候支撑我们整个架构的设计思路。
1,实际使用当中,接口并不是必须的,虽说根据依赖倒置原则,无论是处于高层的外观层,还是处于底层的子系统,都应该依赖于抽象,但是这会倒置子系统的每一个实现都要对应一个接口,从而导致系统的复杂性增加,所以这样做并不是必须的。
2,外观接口当中并不一定是子系统中某几个功能的组合,也可以是将子系统中某一个接口的某一功能单独暴露给客户端。
3,外观接口如果需要暴露给客户端很多的功能的话,可以将外观接口拆分为若干个外观接口,如此便会形成一层外观层。
package com.facade;public interface Sub1 {void function1();}package com.facade;public interface Sub2 {void function2();}package com.facade;public interface Sub3 {void function3();}package com.facade;public class Sub1Impl implements Sub1{public void function1() {System.out.println("子系统中Sub1接口的功能");}}package com.facade;public class Sub2Impl implements Sub2{public void function2() {System.out.println("子系统中Sub2接口的功能");}}package com.facade;public class Sub3Impl implements Sub3{public void function3() {System.out.println("子系统中Sub3接口的功能");}}package com.facade;public interface Facade {/* 下面随便组装几个功能 */void function12();void function23();void function123();}package com.facade;public class FacadeImpl implements Facade{private Sub1 sub1;private Sub2 sub2;private Sub3 sub3;public FacadeImpl() {super();this.sub1 = new Sub1Impl();this.sub2 = new Sub2Impl();this.sub3 = new Sub3Impl();}public FacadeImpl(Sub1 sub1, Sub2 sub2, Sub3 sub3) {super();this.sub1 = sub1;this.sub2 = sub2;this.sub3 = sub3;}public void function12() {sub1.function1();sub2.function2();}public void function23() {sub2.function2();sub3.function3();}public void function123() {sub1.function1();sub2.function2();sub3.function3();}}package com.facade;public class Client {public static void main(String[] args) {Facade facade = new FacadeImpl();facade.function12();System.out.println("-------------------------");facade.function23();System.out.println("-------------------------");facade.function123();/* 以上为使用了外观模式的调用方式,以下为原始方式 */System.out.println("-------------以下原始方式--------------");Sub1 sub1 = new Sub1Impl();Sub2 sub2 = new Sub2Impl();Sub3 sub3 = new Sub3Impl();sub1.function1();sub2.function2();System.out.println("-------------------------");sub2.function2();sub3.function3();System.out.println("-------------------------");sub1.function1();sub2.function2();sub3.function3();}}
