Android性能优化—代码结构设计模式优化

一道面试题

BAT招聘面试题:
你能手写一个单例设计模式吗?分析一下它是怎样工作的。
你能熟练使用哪些设计模式?并分析一下

设计模式的重要性

BAT招聘需求:

Baidu:
https://www.zhipin.com/job_detail/ef45ee4fcc18bca41Xx52NW1EFs~.html?ka=search_list_2
阿里:
https://www.zhipin.com/job_detail/c74b2b035fe446ae1Xd42t61Elo~.html?ka=search_list_7
华为:
https://www.zhipin.com/job_detail/33bdb1207653b4571HR_0tW6ElM~.html?ka=search_list_15
腾讯:
https://www.zhipin.com/job_detail/e53ac0f672ca3b2c1HZ73t-7FFE~.html?ka=search_list_12

什么是垃圾代码

垃圾代码表征
业务代码与技术代码耦合
主业务和增值业务代码职责耦合
多余的依赖关系

带来的问题
可读性差
可复用性差
可维护性差
易变更性差
相互依赖

比如:
app中直接引用了第三方网络请求库,如果这个第三方网络请求库后期需要改成其他的第三方网络请求库,则需要修改大量代码。
网络请求库:volley->okhttp->retrofit
图片加载库:Android-Universal-Image-Loader -> picasso -> glide -> fresco

架构类图:
在这里插入图片描述

面向对象设计原则

设计原则是中心,设计模式是设计原则的扩展。

设计原则(SOLID原则)

垃圾代码清理工作的设计原则是什么?
开闭原则:对扩展开放,对修改关闭。对代码的功能扩展是开放,而对已写好的代码做修改是关闭;

门面模式(外观模式)

定义:要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行,门面模式提供了一个高层次的接口,使得子系统更易于使用;

目的:
(1)门面对象是连接外界和子系统内部的唯一通道;
(2)通过门面对象降低程序耦合;
在这里插入图片描述
工厂是负责生产的,不负责接待顾客,怎么办呢,开门店,门店负责接待顾客。
在这里插入图片描述

门面模式类图

在这里插入图片描述

门面模式系统架构图

解耦: 客户端与第三方库(子系统)解耦,让子系统内部模块功能更容易拓展和维护。

单一职责:客户端根本不需要知道第三方系统提供什么功能甚至不需要知道第三方系统如何使用,只需要和中间门面类交互即可。

架构类图:
在这里插入图片描述

解密门面模式优缺点

在这里插入图片描述

如果更换了第三方网络请求库,扩展程序功能,则需要大量修改原来中间门面层的代码,违背了开闭原则,怎么办?引入代理模式!

代理模式

定义:给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用;
目的:
(1)通过引入代理对象的方式来间接访问目标对象,防止直接访问目标对象给系统带来的不必要复杂性;
(2)通过代理对象对原有的业务增强;

门店里买的产品不能继续满足需求,想要买功能更多的高级产品,怎么办?找代购!
在这里插入图片描述

代理模式类图

在这里插入图片描述

架构再重构

架构类图:
在这里插入图片描述

用代理模式对上述例子的代码进行重构,通过代理模式,一旦更换了第三方网络加载库,则只需要创建一个新的中间门面层,然后设置到代理对象中即可,这样原来的那个中间门面层代码废弃即可,符合开闭原则。
在这里插入图片描述

总结

设计模式有什么用?

帮助我们将应用组织成容易了解,容易维护,具有弹性的架构;
建立可维护的系统,要诀在于随时想到系统以后可能需要的变化以及应付变化的原则。

在这里插入图片描述

另外,了解了各种设计模式后,看很多开源框架的源码也会容易很多。

设计模式总结

单例模式
装饰模式—FILE IO 有详细分析
建造者模式——Okhttp源码解析中分析

代理模式 ——注解中讲解
享元模式——handler源码
适配器模式——无处不在
代理模式 —— 注解中讲解/retrofit源码中讲解
外观模式—— 架构隔离

迭代器模式—— 容器中用的非常广泛
观察者设计模式—换肤架构里面有实战,rxjava
责任链模式——Okhttp源码/事件分发源码

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/yzpbright/article/details/109189849
今日推荐