外观模式定义
为子系统的各个接口提供一个统一的界面,提供一个高层的接口,对外隐藏内部实现和调用关系,使得子系统更容易使用。
符合的设计模式原则
最少知道原则(迪米特法则),里氏替换原则,依赖倒置原则
外观模式UML类图
在类图中可以看出,Facede是系统对外的统一接口,用于封装内部的实现,并和外界进行交互。interfaceA,interfaceB,interfaceC为Facede依赖的接口,他们负责具体的实现,并且内部可能有相关调用关系,使用外观模式,使得内部逻辑对用户透明,用户只需要使用Facede就可以了。
外观模式举例说明
public interface Facede {
void operation1();
void operation2();
void operation3();
}
public class FacedeImpl implement Facede{
private InterfaceA mInterfaceA = new InterfaceAImpl();
private InterfaceB mInterfaceB = new InterfaceBImpl();
private InterfaceC mInterfaceC = new InterfaceCImpl();
@Override
void operation1() {
mInterfaceA.realOperation1();
}
@Override
void operation2() {
mInterfaceB.realOperation2();
}
@Override
void operation3() {
mInterfaceC.realOperation3();
}
}
以上代码中,Facede作为高层接口,用来提供统一的接口,FacedeImpl实现Facede,Facede是外观类,它依赖具体的子系统接口,并调用子系统的方法,用来实现具体的功能,并封装内部逻辑细节。我们可以发现,在这个例子中,Facede只是定义了一系列的接口,但是他的实现类并没有直接实现这些功能,而是调用了各个子系统的方法来实现的功能。它的作用类似于调度器或者总线,协调各个子系统的运转。
外观模式使用场景
当要为一个复杂的系统提供一个简单的接口的时候可以使用,比如封装SDK,网络库,图片加载库等。关键一点就是,当内部比较复杂,需要提供一个简单的统一接口的时候就可以使用。
外观模式在Android源码中的实现
Context在Android中使用广泛,它封装了很多的重要操作。比如startActivity,sendBroadcast,调用系统资源等。它是一个抽象类,具体功能由ContextImpl实现,但是ContextImpl不具备实现这些功能的能力,在它的内部调用了其他的类(子系统)来实现具体的功能,比如调用ActivityManagerService实现startActivity。可以看出,这是典型的外观模式的运用,Context提供统一的高层接口,具体功能由子系统实现。具体内容可以查阅Context,ContextImpl相关源码。