维基百科

外观模式

外观模式(Facade pattern),是软件工程中常用的一种软件设计模式,它为子系统中的一组接口提供一个统一的高层接口,使得子系统更容易使用。

Java

这是一个抽象的示例。一个客户“you”通过外观接口“computer”获取计算机内部复杂的系统信息。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/* Complex parts */

class CPU {
	public void freeze() { ... }
	public void jump(long position) { ... }
	public void execute() { ... }
}

class Memory {
	public void load(long position, byte[] data) {
		...
	}
}

class HardDrive {
	public byte[] read(long lba, int size) {
		...
	}
}

/* Façade */

class Computer {
	public void startComputer() {
		cpu.freeze();
		memory.load(BOOT_ADDRESS, hardDrive.read(BOOT_SECTOR, SECTOR_SIZE));
		cpu.jump(BOOT_ADDRESS);
		cpu.execute();
	}
}

/* Client */

class You {
	public static void main(String[] args) {
		Computer facade = new Computer();
		facade.startComputer();
	}
}

例子

抽象类

1
2
3
public interface ServiceA {
    public void methodA();
}
1
2
3
public interface ServiceB {
    public void methodB();
}
1
2
3
public interface ServiceC {
    public void methodC();
}

实现类

1
2
3
4
5
6
public class ServiceAImpl implements ServiceA {
    @Override
    public void methodA() {
        System.out.println("这是服务A");
    }
}
1
2
3
4
5
6
public class ServiceBImpl implements ServiceB {
    @Override
    public void methodB() {
        System.out.println("这是服务B");
    }
}
1
2
3
4
5
6
public class ServiceCImpl implements ServiceC {
    @Override
    public void methodC() {
        System.out.println("这是服务C");
    }
}

外观类

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Facade {
    ServiceA sa;
    ServiceB sb;
    ServiceC sc;

    public Facade() {
        sa = new ServiceAImpl();
        sb = new ServiceBImpl();
        sc = new ServiceCImpl();
    }

    public void methodA(){
        sa.methodA();
        sb.methodB();
    }

    public void methodB(){
        sb.methodB();
        sc.methodC();
    }

    public void methodC(){
        sc.methodC();
        sa.methodA();
    }
}

Test

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
public class Test {
    public static void main(String[] args) {
        ServiceA sa = new ServiceAImpl();
        ServiceB sb = new ServiceBImpl();

        sa.methodA();
        sb.methodB();
        System.out.println("=========");
        //facade
        Facade facade = new Facade();
        facade.methodA();
        facade.methodB();
    }
}

运行结果:

1
2
3
4
5
6
7
这是服务A
这是服务B
=========
这是服务A
这是服务B
这是服务B
这是服务C