关闭

Android源码中的外观模式

标签: Android源码外观模式设计模式
1376人阅读 评论(0) 收藏 举报

从装饰者模式到Context类族

当观察者模式和回调机制遇上Android源码

Android源码中的静态工厂方法

Android中的工厂方法模式

Android源码中的命令模式

Android源码中的适配器模式

定义

外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。

使用场景

  1. 当你要为一个复杂子系统提供一个简单接口时。
  2. 客户程序与抽象类的实现部分之间存在着很大的依赖性。引入Facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。
  3. 当你需要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点,如果子系统之间是相互依赖的,你可以让他们仅通过Facade进行通讯,从而简化了他们之间的依赖关系。

结构

模式所涉及的角色有:

  • Client : 客户端程序。

  • Facade : 对外的统一入口,即外观对象。

  • SubSystem : 子系统或者子服务等等。

实现

编程嘛,抽象于生活高于生活,接下来我们用生活中智能家居的小例子来分析一下外观模式。智能家居为什么会流行,其中一个原因肯定是方便,我们用一个中央处理器就可以管理我们所有的智能家居产品,类似的还有现在的一站式服务那么用户就是Client角色,中央处理器就是Facade角色,音箱、TV、空调等等就是SubSystem角色。

Facade角色

public class Facade {

    private Light mLight = new Light();
    private AirCondition mAirCondition = new AirCondition();

    /**
     * 还可能会有方法集,比如我的习惯是下班回家,开灯、开空调,空调温度调节到20度
     */
    public void doMyHabit(){
        mLight.lightOn();
        mAirCondition.airConditionaOn();
        mAirCondition.setTemperature(20);
    }

    public void lightOn(){
        mLight.lightOn();
    }

    public void lightOff(){
        mLight.lightOff();
    }

    public void airConditionaOn() {
        mAirCondition.airConditionaOn();
    }

    public void airConditionaOff() {
        mAirCondition.airConditionaOff();
    }

    public void setTemperature(int temperature) {
        mAirCondition.setTemperature(temperature);
    }
}

子系统

public class Light {

    public void lightOn(){
        Log.e("Light","on");
    }

    public void lightOff(){
        Log.e("Light","off");
    }
}

public class AirCondition {

    public void airConditionaOn() {
        Log.e("AirCondition", "on");
    }

    public void airConditionaOff() {
        Log.e("AirCondition", "off");
    }

    public void setTemperature(int temperature) {
        Log.e("AirCondition", "temperature:" + temperature);
    }
}

不知道大家有没有发现一个问题,外观模式和我们上篇说的适配器模式是不是有一些相似呢?

Facade与Adapter和Proxy有类似之处,但是Proxy注重在为Client-Subject提供一个访问的中间层,Adapter注重对接口的转换与调整,而Facade所面对的往往是多个类或其他程序单元,通过重新组合各类及程序单元,对外提供统一的接口/界面。

Android源码中的外观模式

在Android中,Context类族是比较重要的,关于这些,在从装饰者模式到Context类族,Android Handler 消息机制(解惑篇)中已经做过说明,这里就不再画UML图了。

它是提供应用环境(application environment)信息的接口。通过它可以访问到应用的资源和类,以及进行一些系统级别的操作,比如加载activity、发送广播和接收intent等。这代表什么呢,Context类给我们提供了一站式服务,这里当然应用了外观模式。

在应用启动时,首先会fork一个子进程,并且调用ActivityThread.main方法启动该进程。ActivityThread又会构建Application对象,然后和Activity、ContextImpl关联起来,然后再调用Activity的onCreate、onStart、onResume函数使Activity运行起来。

Activity启动之后,Android给我们提供了操作系统服务的统一入口,也就是Activity本身。这些工作并不是Activity自己实现的,而是将操作委托给Activity父类ContextThemeWrapper的mBase对象,这个对象的实现类就是ContextImpl ( 也就是performLaunchActivity方法中构建的ContextImpl )。

ContextImpl内部封装了一些系统级别的操作,有的子系统功能虽然没有实现,但是也提供了访问该子系统的接口,比如获取ActivityManager的getActivityManager方法。

外观模式非常的简单,只是封装了子系统的操作,并且暴露接口让用户使用,避免了用户需要与多个子系统进行交互,降低了系统的耦合度、复杂度。

测试代码已上传到github

参考链接

https://github.com/simple-android-framework/android_design_patterns_analysis/tree/master/facade/elsdnwn

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

java/android 设计模式学习笔记(14)---外观模式

这篇博客来介绍外观模式(Facade Pattern),外观模式也称为门面模式,它在开发过程中运用频率非常高,尤其是在现阶段各种第三方 SDK 基本很大概率都会使用外观模式。通过一个外观类使得整个系统...
  • zhao_zepeng
  • zhao_zepeng
  • 2016-07-17 18:14
  • 3407

Android重拾设计模式系列——外观模式

定义及实质 定义 为子系统中的一组接口提供一个一致的界面,这个界面使得子系统更加容易使用。 解释:英雄吹响号角(相当于统一界面,用于发动攻击),命令部队对敌军发动攻击;接下来部队里的各种兵种开始...
  • qq_31370269
  • qq_31370269
  • 2016-11-16 12:51
  • 3687

Tomcat源码深入——Servlet容器之外观模式

之前一直很好奇Tomcat究竟是怎么实现的,刚开始学的时候还不懂容器和服务器这些有什么区别,Apache和Tomcat的区别及Web服务器,容器和应用服务器区别问题。直接看源码的话感觉还是会觉得一头雾...
  • iaiti
  • iaiti
  • 2016-06-28 19:40
  • 1418

装饰者模式与外观者模式的区别

(转载)http://bbs.bccn.net/thread-216717-1-1.html 很久没有来这一个论坛里了,一上来就看到很多关于设计模式的贴子上了精,今天我也来谈一下设计模式,我现在所介绍...
  • zhuhai__yizhi
  • zhuhai__yizhi
  • 2016-03-03 09:55
  • 1087

外观模式(注意区别于中介者模式)

一.外观模式(有点像中介者模式) 通过一个外观类使得整个系统的接口只有一个统一的高层接口,这样就能降低用户的使用成本,也就对用户屏蔽了很多实现细节,当然在我们的开发过程中,外观模式也是我们封装API的...
  • u011889786
  • u011889786
  • 2016-06-05 21:24
  • 1588

JAVA设计模式之门面模式(外观模式)

医院的例子   现代的软件系统都是比较复杂的,设计师处理复杂系统的一个常见方法便是将其“分而治之”,把一个系统划分为几个较小的子系统。如果把医院作为一个子系统,按照部门职能,这个系统可以划分为挂号、门...
  • jason0539
  • jason0539
  • 2014-04-02 07:16
  • 25224

设计模式(八)外观模式

当我们开发Android的时候,无论是做SDK还是封装API,我们大多都会用到外观模式,它通过一个外观类使得整个系统的结构只有一个统一的高层接口,这样能降低用户的使用成本。
  • itachi85
  • itachi85
  • 2016-07-25 10:26
  • 11793

装饰模式 VS. 外观模式

一、装饰模式         小菜想要和MM约会需要给自己扮靓,而新入住房子之前也需要对每个房间装修一遍,这些事情都有一个共同的特点,就是一个词“装饰”,我们可以把装饰模式应用在这些事情上面。 ...
  • xdd19910505
  • xdd19910505
  • 2014-04-06 16:44
  • 1897

【设计模式之三:模式对比】外观模式、代理模式与中介者模式的区别

外观模式 个人理解:         子类继承外观类的所有属性方法,客户端只需要跟外观类进行交流,实现了对所有子类的封装。 没有使用外观类 如图:         应用外观类 ...
  • cangchen
  • cangchen
  • 2015-04-08 23:05
  • 2664

装饰模式、装饰器模式、代理模式、外观模式区别

装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。 用代理模式,代理类可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象...
  • zhang31jian
  • zhang31jian
  • 2016-01-18 17:21
  • 2311
    个人资料
    • 访问:194350次
    • 积分:2239
    • 等级:
    • 排名:第19385名
    • 原创:40篇
    • 转载:0篇
    • 译文:3篇
    • 评论:105条
    我的微信公众号
    长期为您推荐优秀博文、开源项目、视频等,进入还有好玩的等着你。扫一扫下方二维码或搜索微信号codertopia即可关注:
    我的

    QQ群:469291650


    GitHub
    我的个人博客
    博客专栏
    Relax
    最新评论