外观模式-统一的编程接口

外观模式定义

       为子系统的各个接口提供一个统一的界面,提供一个高层的接口,对外隐藏内部实现和调用关系,使得子系统更容易使用。

符合的设计模式原则

       最少知道原则(迪米特法则),里氏替换原则,依赖倒置原则

外观模式UML类图外观模式-统一的编程接口_第1张图片

       在类图中可以看出,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相关源码。

你可能感兴趣的:(设计模式)