外观模式
概述
在庞大而复杂的子系统中,客户端需要调用子系统中某些个方法实现业务服务,那么可以借助一个外观对象来简化客户端与子系统的对接,降低客户端与子系统的耦合,且客户端调用业务服务显得更简洁方便。
外观模式:为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用
简单例子实现:
- 子系统组件高层接口1
public interface demoInterface {//从子系统抽出的一个高层接口
void Method();
}
- 子系统组件高层接口2
public interface demoInterface2 {//从子系统抽出的一个高层接口
void test();
}
- 子系统组件
public class ServiceA implements demoInterface {
public void Method() {
System.out.println("实现业务A");
}
}
public class ServiceB implements demoInterface{
public void Method() {
System.out.println("实现业务B");
}
}
public class ServiceC implements demoInterface2{
public void test() {
System.out.println("实现业务C");
}
}
public class ServiceD implements demoInterface2{
public void test() {
System.out.println("实现业务D");
}
}
- 外观对象,将需要的Api封装好(对象创建于逻辑代码)
public class FacadeMethod {
private demoInterface a1;
private demoInterface2 a2;
public FacadeMethod(int type){
switch (type) {
case 1:{
a1 = new ServiceA();
a2 = new ServiceC();
}
case 2:{
a1 = new ServiceA();
a2 = new ServiceD();
}
case 3:{
a1 = new ServiceB();
a2 = new ServiceC();
}
case 4:{
a1 = new ServiceB();
a2 = new ServiceD();
}
}
}
public void method() {
//还可加入其它业务逻辑代码
a1.Method();
a2.test();
}
}
- 客户端demo,客户端只需要引入外观对象,即可实现业务需求
public class demo {
public static void main(String[] args) {
FacadeMethod facadeMethod1 = new FacadeMethod(1);
facadeMethod1.method();
/*
FacadeMethod facadeMethod2 = new FacadeMethod(2);
facadeMethod2.method();
FacadeMethod facadeMethod3 = new FacadeMethod(3);
facadeMethod3.method();
FacadeMethod facadeMethod4 = new FacadeMethod(4);
facadeMethod4.method();*/
}
}
适用场景
- 系统中有多个复杂模块或子系统,某些业务需要其中一个或多个组件或逻辑稍复杂
- 指向复杂子系统的已有的直接接口并不能满足业务需求
优点
- 代码独立于复杂子系统和客户端之间,降低客户端代码与子系统的耦合度
- 客户端对象数相对减少,更易使用组件,客户端代码变得简单
缺点
- 外观对象与大多数对象都有耦合

浙公网安备 33010602011771号