11.5设计模式-外观模式-详解

设计模式-外观模式

retrofit。引入一个外观角色,来简化客户端与系统之间的交互。加快功能速度,降低系统的复杂度

    1. 外观设计模式详解
    1. 外观模式在android的实际运用
11_1-11-7[01_29_39][20180801-220956-1].jpg

1.外观设计模式详解

1.概念
    外观模式的主要目的在于让外部减少与子系统内部多个模块之间的交互,从而让外部能够更简单的使用子系统。它负责把客户端的请求转发给子系统内部的各个模块进行处理
2.使用场景
    1.当你要为一个复杂子系统提供一个简单接口时。
    2.客户程序与抽象类的实现部分之间存在很大的依赖性。
    3.当你需要构建一个层次结构的子系统时。
3.UML结构图分析
图:
    
    
                         Facade                         ModuleA
                         ----------------    --->       ----------------
                         +testOperation();                  
    
    client                                              ModuleB
    ------------                             --->       ----------------
                                                        +test();
                                                        
                                                        ModuleC
                                              --->       ----------------
                                                        +test();
                                                        
  使用了Facade这个外观类之后,客户端就不需要关注 子系统各模块的变化了。
4.实际代码分析
    pubic class ModuleA{
        public void testFuncA(){
            System.out.println("This is Function From ModuleA")
        }
    }
    public class Facade{
        private ModuleA moduleA;
        private ModuleA moduleB;
        private ModuleA moduleC;
        private static Facade mFacade;
        private Facade(){
            moduleA = new ModuleA();
            moduleB = new ModuleB();
            moduleC = new ModuleC();
        }
        public static Facade getInstance(){
            if(mFacade == null){
                mFacade = new Facade();
            }
            return mFacade;
        }
        public void testOperation(){
            moduleA.testFuncA();
            moduleB.testFuncB();
            moduleC.testFuncC();
        }
    }
    Facade 持有了三个模块对象,并将其初始化
    单例模式实现,整个系统只有一个
    
    调用: Facade.getInstance().testOperation();

5.外观模式优点
    1.由于Facade类封装了各个模块交互的过程,如果后续内部模块调用关系发生了变化,只需要修改Facade实现就可以了。
    2.Facade实现可以被多个客户调用的(单例)

2.外观模式在android的实际运用(ContextImpl)

图:
1.android开启一个进程的时候,它首先会调用 ActivityThead的static void Main(String[] argsw     )方法:
    1.trace路径 2.初始环境变量 3.打印些报告 4.初始化文件 
    5.比较重要的 Looper.prepareMainLooper();
    6.创建一个ActivityThread thread = new ActivityThread();//
        既然有looper,那么就会发送消息。如何发送的消息,调用了什么方法来进行开启Activity
        handleMessage(Message msg){}方法中
            switch(msg.what){
                case LAUNCH_ACTIVITY:
                    final ActivityClientRecord r = (ActivityClientRecord)msg.obj;
                    r.packageInfo = getPackageInfoNoCheck(r.activityInfo.applicationInfo,r.compatInfo)
                    handleLaunchActivity(r,null,"LAUNCH_ACTIVITY")
            }
        handleLaunchActivity(ActivityClientRecord r,Intent customIntent,String reason)
            主要是调用了 Activity a = performLaunchActivity(r,customIntent)来进行具体操作
        performLaunchActivity(ActivityClientRecord r,Intent customIntent)
            初始化了很多,ActivityInfo,ComponentName,Activity
            最重要的用了一个activity.attach(appContext,this,getInstrumentation(),r.token
                r.ident,app,r.intent,r.activityInfo,title,r.parent,r.embeddedID,r.lastNonConfigrurationInstance,config,r.referrer,r.voiceInteractor,window)方法
                这个方法将将appContex,infomation,和app号等关联在一起
                activity的父类是Context,所以activity拥有context的方法:比如开启Activity,发送广播,bindService等等
                activity内部并不实现这些具体的功能,它只是继承Conext接口,他的具体操作会交给ContexImpl这个对象来做,这里使用的是ContextImpl的外观模式
                    activity的attach方法做了很多繁琐功能,第一行attachBaseContext(context);
                        将我们的一个context参数传递给父类ContextThemeWraper的父类ContextImpl 的属性mBase字段
        ContextWrapper类
            字段 Context mBase;
            这里activity充当是的代理类的角色,通过Activity对象findViewById,setOnClickxx都是代理了ContextImpl的操作,它内部调用的都是ContextImpl额方法
        ContextImpl类
            方法:startActivity(Intent intent){
                warnIfCallingFromSystemProcess();
                startActivity(intent,null);
            } 
            startActivity(intent,Bundle options){
                warnIfCallingFromSystemProcess();
                mMainThread.getInstrumentation().exxxxActivity(getOuterContext(),mMainThread.getApplicationThread(),null,(Activity)null,intent,-1,options);
            }
            主线程的instrumentation来开启我们的activity,传入全局的activity,全局的线程
            如果每次开启activity都要做如此繁杂的操作时,会太复杂了,所以ContextImpl把四大组件的startActivty,bindService都封装好了,只要通过这个抽象的统一接口就是可以操作startActivity,这样就降低了用户和系统交互的成本,屏蔽了一些细节。
            


            
通过一个高层的接口统一提供给用户,用户不会知道整个子系统模块的变化,调用外观类即可           
11_1-11-7[01_29_39][20180801-220956-1].jpg
11_1-11-7[01_34_49][20180801-222602-2].jpg
11_1-11-7[01_36_15][20180802-082845-4].jpg
11_1-11-7[01_36_32][20180802-082838-3].jpg
11_1-11-7[01_36_37][20180802-083026-5].jpg
11_1-11-7[01_36_48][20180802-083049-6].jpg
11_1-11-7[01_36_52][20180802-083147-7].jpg
11_1-11-7[01_37_32][20180802-083602-0].jpg
11_1-11-7[01_37_36][20180802-083555-9].jpg
11_1-11-7[01_37_37][20180802-083550-8].jpg
11_1-11-7[01_37_50][20180802-084153-2].jpg
11_1-11-7[01_37_50][20180802-084154-3].jpg
11_1-11-7[01_39_01][20180802-084133-1].jpg
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,182评论 25 707
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,732评论 2 59
  • 设计模式概述 在学习面向对象七大设计原则时需要注意以下几点:a) 高内聚、低耦合和单一职能的“冲突”实际上,这两者...
    彦帧阅读 3,748评论 0 14
  • 生活在现实生活中,钱是生活的必需品,没有钱真的是寸步难行的! 记得第一次借钱,是学生时代,应该是在初中一年级。那时...
    白丰阁阅读 880评论 2 3
  • 成长的痛,缓慢刺骨 成长的痛,需要时间来治愈 这世界慢慢拉开幕布 幕布里却罩着一层雾 看不清,摸不着 久久的迷宫麻...
    晨光拂晓阅读 600评论 18 21