定义
外观模式是软件工程中常用的一种软件设计模式。它为子系统中的一组接口提供一个统一的高层接口。这一接口使得子系统更加容易使用。
相比起观察者模式,适配器模式等适合小规模使用的设计模式,外观模式更多的是大范围的使用,它会是很多时候支撑我们整个架构的设计思路。
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();
}
}
graph BT
sub-->sub1impl
sub2-->sub2impl
face-->sub2impl
face-->sub1impl