Android设计模式(二十二)-外观模式

2017-04-11  本文已影响55人  喵了个呜s

外观模式猛一听有点蒙逼,但是在开发中我们应该都用过,只是没这个概念罢了。

比如在开发时通常会把图片加载框架和网络框架进行封装,封装到最后只暴露出来一个最上级的类供外部调用,外部调用这一个类提供的方法,然后这个类内部具体调用了什么,用的什么逻辑等等外部都不用管。这样也方便后期随便更换图片加载框架和网络框架,而业务代码不用做任何改动。
博客地址
这其实就是外观模式的一种实现。

定义

要求子系统的外部与其内部的通讯必须通过一个统一的对象进行。提供一个高层次接口,使得子系统更易于使用,

使用场景

UML

比如客户端要用子系统A和B一起来完成一个操作,又要用B和C和D完成一个操作,那么就需要同事依赖着四个类。子系统有了一个门面之后,客户端就可以只依赖这个门面,调用他的方法。这个门面内部会调度各个子系统来完成协调工作。

简单实现

这里以一个手机为例。然后再更精简一点。手机可以看成是一个系统的facade,他继承了电话,上网,摄像头功能。当我们需要视频通话时,只需要调用手机的视频通话功能就行,通话结束后直接调用挂机就行。因为手机已经集成了这些功能,手机内部会调用各个系统来完成这个操作。

想象一下如果没有手机的封装,我们视频通话的操作可能就是:打开摄像头--上网--通话。然后挂断就要手动断掉通话,然后手动关掉摄像头。

先看电话功能模块:

public interface Phone {
     void dail();
     void hangup();
}

public class PhoneImpl implements Phone {
    @Override
    public void dail() {
        System.out.println("打电话");
    }

    @Override
    public void hangup() {
        System.out.println("挂断");
    }
}

摄像头模块:

public interface Camera {
    void open();
    void takePicture();
    void close();
}

public class CameraImpl implements Camera {
    @Override
    public void open() {
        System.out.println("打开相机");
    }

    @Override
    public void takePicture() {
        System.out.println("开始视频");
    }

    @Override
    public void close() {
        System.out.println("关闭相机");
    }
}

然后封装一个门面:

public class MobilePhone {
    private Phone phone = new PhoneImpl();
    private Camera camera = new CameraImpl();
    public void videoChat(){
        camera.open();
        phone.dail();
    }
    public void hangup(){
        phone.hangup();
        camera.close();
    }
}

客户端直接调动统一的接口就行了:

public class Client {
    public static void main(String[] args) {
        MobilePhone mobilePhone = new MobilePhone();
        mobilePhone.videoChat();
        System.out.println("----");
        mobilePhone.hangup();
    }
}

输出:

总结

外观模式的精髓就在于封装。通过封装出一个高层的统一调动接口,为系统提供统一的API,让用户通过一个API就能控制整个系统,减少 用户的使用成本,也提高了系统的灵活性。

优点

缺点

上一篇 下一篇

猜你喜欢

热点阅读