android源码 外观模式,Android 外观模式

一、前言

Android 外观模式(Facade),这个模式的使用率就非常高了。我们经常引用一些第三方的功能,或者GitHub上别人封装好的功能。很多都使用的时外观模式。封装过后,我们在使用这些库的时候,只需要调用极少数的方法就可以达到目的。  我相信大家已经无数次的使用外观模式了。接下来让我们“重新”认识一下外观模式。

二、定义

提供一个接口,使得客户端只通过接口访问。隐藏内部子系统的实现。

三、例子

认识设计模式最好的方法就是理解它的demo。下面我们通过一个生产nokia手机的例子来说明。我们分为三个步骤,设计,开发和生产来模拟整个过程。

3.1、最高层接口

抽象出API方法,并实现public abstract class NokiaPhone {    public abstract void design();    public abstract void development();    public abstract void production();

}public class NokiaPhoneImpl extends NokiaPhone{    private Software software = new SoftwareImpl();    private Hardware hardware = new HardwareImpl();    private Production production = new ProductionImpl();    @Override

public void design() {

hardware.design();

software.design();

}    @Override

public void development() {

hardware.development();

software.development();

}    @Override

public void production() {

hardware.test();

software.test();

production.production();

}

}

最高层接口就是为了统一API,客户端调用只需要调用设计,开发和生产三个方法举行了,具体内部实现无须关注。具体的实现由内部的子系统去完成。

3.2、子系统

硬件部public interface Hardware {    public void design();    public void development();    public void test();

}public class HardwareImpl implements Hardware {    private static final String TAG = HardwareImpl.class.getSimpleName();    @Override

public void design() {

Log.d(TAG,"design");

}    @Override

public void development() {

Log.d(TAG,"development");

}    @Override

public void test() {

Log.d(TAG,"test pass");

}

}

软件部public interface Software {    public void design();    public void development();    public void test();

}public class SoftwareImpl implements Software{    private static final String TAG = SoftwareImpl.class.getSimpleName();    @Override

public void design() {

Log.d(TAG,"design");

}    @Override

public void development() {

Log.d(TAG,"development");

}    @Override

public void test() {

Log.d(TAG,"test pass");

}

}

生产部public interface Production {    public void production();

}public class ProductionImpl implements Production {    private static final String TAG = ProductionImpl.class.getSimpleName();    @Override

public void production() {

Log.d(TAG,"production nokia");

}

}

三个部门的职能写的比较简化,子系统还可以包含更多的子系统,比如软件部还有测试组、系统组等等。这里为了篇幅就不举例了。

3.3、调用NokiaPhoneImpl nokiaPhoneImpl = new NokiaPhoneImpl();

nokiaPhoneImpl.design();

nokiaPhoneImpl.development();

nokiaPhoneImpl.production();

客户端的调用就很简单了,和抽象类抽象出的方法一样。统一的API只有三个。具体的实现由子系统去完成。输出如下:02-21 10:07:51.896 6606-6606/com.yink.designpattern.designpattern D/HardwareImpl: design

02-21 10:07:51.896 6606-6606/com.yink.designpattern.designpattern D/SoftwareImpl: design

02-21 10:07:51.896 6606-6606/com.yink.designpattern.designpattern D/HardwareImpl: development

02-21 10:07:51.896 6606-6606/com.yink.designpattern.designpattern D/SoftwareImpl: development

02-21 10:07:51.896 6606-6606/com.yink.designpattern.designpattern D/HardwareImpl: test pass

02-21 10:07:51.896 6606-6606/com.yink.designpattern.designpattern D/SoftwareImpl: test pass

02-21 10:07:51.896 6606-6606/com.yink.designpattern.designpattern D/ProductionImpl: production nokia

四、Context

Android源码中,Context就是外观模式的一个例子。Context这个抽象类定义了很多我们熟知的方法。它具体的实现都是在ContextImpl.java这个类里边。篇幅原因,多余的方法就省略了。public abstract class Context {  public abstract void sendBroadcast(@RequiresPermission Intent intent);  public abstract ComponentName startService(Intent service);

...class ContextImpl extends Context {  @Override

public void sendBroadcast(Intent intent, String receiverPermission) {

warnIfCallingFromSystemProcess();

String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());

String[] receiverPermissions = receiverPermission == null ? null

: new String[] {receiverPermission};        try {

intent.prepareToLeaveProcess(this);

ActivityManager.getService().broadcastIntent(

mMainThread.getApplicationThread(), intent, resolvedType, null,

Activity.RESULT_OK, null, null, receiverPermissions, AppOpsManager.OP_NONE,                    null, false, false, getUserId());

} catch (RemoteException e) {            throw e.rethrowFromSystemServer();

}

}  @Override

public ComponentName startService(Intent service) {

warnIfCallingFromSystemProcess();        return startServiceCommon(service, false, mUser);

}

而ContextImpl实现这些抽象方法时,又通过了ActivityManager、PackageManager一系列的其他子系统。

作者:Yink_Liu

链接:https://www.jianshu.com/p/4443c848b785

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值