一、定义

为子系统中的一组接口提供一个统一的接口。外观模式定义了一个高层次的接口,让子系统更加容易使用。

二、类图表示

外观模式

三、实现

1、SubSustem Interfaces

package pattern.structual.facade;

public interface InterfaceA {

	public void methodAlpha();
}


package pattern.structual.facade;

public interface InterfaceB {

	public void methodBravo();
}


package pattern.structual.facade;

public interface InterfaceC {

	public void methodCharlie();
}

2、SubSystem Interface Implementor

package pattern.structual.facade;

public class ImplementorA implements InterfaceA {

	@Override
	public void methodAlpha() {
		System.out.println("SubSystem InterfaceA method...");
	}

}


package pattern.structual.facade;

public class ImplementorB implements InterfaceB {

	@Override
	public void methodBravo() {
		System.out.println("SubSystem InterfaceB method...");
	}

}


package pattern.structual.facade;

public class ImplementorC implements InterfaceC {

	@Override
	public void methodCharlie() {
		System.out.println("SubSystem InterfaceC method...");
	}

}

3、Facade

package pattern.structual.facade;

public class Facade {

	private InterfaceA alpha;
	private InterfaceB bravo;
	private InterfaceC charlie;
	
	public Facade(){
		alpha = new ImplementorA();
		bravo = new ImplementorB();
		charlie = new ImplementorC();
	}
	
	public void methodOne(){
		System.out.println("Facade MethodOne:");
		alpha.methodAlpha();
		bravo.methodBravo();
		charlie.methodCharlie();
	}
	
	public void methodTwo(){
		System.out.println("Facade MethodTwo:");
		alpha.methodAlpha();
		charlie.methodCharlie();
	}
}

四、使用

package pattern.structual.facade;

public class Client {

	public static void main(String[] args) {
		Facade facade = new Facade();
		facade.methodOne();
		
		System.out.println();
		
		facade.methodTwo();
	}
}

  • 程序输出:

外观模式测试程序输出

五、适用场合

  • 当需要为一个复杂的子系统提供一个简单的接口时
  • 当客户端程序与子系统接口(或抽象类)的实现之间存在很大的依赖性时,使用外观模式可以将客户端与这个子系统以及其他的子系统分离,从而提高子系统的独立性和可移植性
  • 当子系统之间是相互依赖的,可以使用外观模式定义子系统间的通信接口,从而简化它们之间的依赖关系