SlideShare ist ein Scribd-Unternehmen logo
1 von 22
安卓中的设计模式举例
by hjm1fb
• 2
编程六原则
•单一职责原则 ,SRP(Single Responsibility Principle)
•开放 - 关闭原则 ,OCP(Open-Close Principle)
•里氏替换原则 ,LSP(Liskov Substitution Principle)
•接口隔离原则 ,ISP(Interface Segregation Principle)
•依赖倒置原则 ,DIP(Dependence Inversion Principle)
•最少知识原则 ,LKP(Least Knowledge Principle), 又称迪米特法
则 ,LOD(Law Of Demeter)
• 3
下面的故事来源是《 Android 源码设计模式解析与实战》,这是本很好的书
(只是书中有些源码的例子我觉得不是完全贴合那章所讲的设计模式,有些
文字也有主观性,不过设计模式本来就是经验性,带有主观性)。在这强烈
推荐,能讲故事的作家就是超棒的程序员。图书购买地址 ,作者博客地址
• 4
小明写一个图片加载库 ImageLoader
第一版只有一个类就实现了图片加载功能,既然是加载图片,就
加了通过内存缓存图片的代码。
业务都包含在一个类里导致代码不易维护和扩展。
所以在做第二版时依据 SOLID 原则重构项目
• 5
1.1 单一职责
划分职责,对代码进行模块化和封装,使得类结构清晰。
依照这个原则, ImageLoader 分成了 ImageLoader 类和 ImageCache 类
前者是图片加载类,后者是图片缓存类。
之后想优化图片缓存,加入 SD 卡缓存,让用户指定缓存位置等。但发现每次想优
化图片缓存,都需要改动 ImageCache 类。而既然 ImageLoader 中引用的
ImageCache 类,那么 ImageCache 类新增了一种特性,必然需要 ImageLoader 类也
增加或者修改代码才能使用这种特性。
这样我们就进入下一个原则。
• 6
1.2 开闭原则
对扩展开放,对修改封闭。当软件需要变化时,应该尽量通过扩
展的方式来实现变化,而不是通过修改已有的代码。实现开闭原
则的重要手段是通过抽象。
所以小明决定在 ImageLoader 中引用的 ImageCache 类改成
ImageCache 接口。
分别实现 MemoryCache , DiskCache , DoubleCache 来表示在内
存中缓存,在 SD 卡中缓存,以及两者结合的双缓存。
• 7
这样只要接口的定义没变, ImageLoader 就不需要修改,如果想
增加新的缓存方式,只需要写一个新的类实现 ImageCache 接口,
而且这样客户端也可以传入自己实现的缓存类。
这样的实现也符合里氏替换原则和依赖倒置原则。
ImageLoader UML 图
• 8
1.3 里氏替换原则
所有引用基类的地方都能够透明的使用其子类的对象。透明是指
不需要关心子类的实现,只要像使用父类一样使用子类即可。
当我们使用不同的 ImageCache 实现类时, ImageLoader 不需要实
现任何改动。
• 9
1.4 依赖倒置原则
模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关
系,其依赖关系是通过接口或抽象类产生。
ImageLoader 原来引用的是 ImageCache 类,小明改成了
ImageCache 接口,这样 ImageLoader 就只依赖于抽象而不依赖具
体的实现。
• 10
1.5 接口隔离原则
客户端不应该依赖它不需要的接口,依赖应最小化。
比如我们的 ImageCache 接口只定义 getCache 和 putCache 两个方法。依照接口隔
离原则能降低类之类的耦合。
• 11
1.6 迪米特原则
一个对象应该对其他对象有最少的了解。
比如小明最先采用 wharton 的 DiskLruCache 实现 DiskCache ,后来替换成了自己实
现的 SD 卡缓存。但这些对客户端都没有影响,因为替换是在 DiskLruCache 内部完
成的,客户端只知道 ImageCache 的 get 和 set 接口。
• 12
可以看出,遵循 SOLID 原则最重要
的途径是抽象,或者说面向接口编
程
设计模式是什么?
对软件设计中普遍存在的各种问题,所提出的可复用的解决思
路。
设计模式的分类
创建型模式 Creation
结构模式 Structure 行为模式 Behavior
创建型模式
抽象了对象实例化过程
1. 单例
Application ( 每个程序有唯一的 Application 类,它的生命周期即此程序的生命周期 )
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)
2. 工厂方法
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)
1. 简单工厂
BitmapFactory.decodeFile(String path, Options opts)
• 抽象工厂
MediaPlayerFactory 的实现类 StagefrightPlayer NuPlayerFactory SonivoxPlayerFactory
TestPlayerFactory 分别生成不同的 MediaPlayerBase
• 建造者 Builder AlertDialog.Builder
• 原型 Prototype 用于在组件之间传递数据的 Intent
结构模式
描述如何将对象结合在一起形成更大的结构
1.适配器 ListView 和 RecyclerView 的 Adapter (不同的 view 和不同的数据源,只要实现 Adapter 的规范,即可
交互)
2.桥接 Window 与 WindowManager
3.组合 ViewGroup( 各种炫酷的 View =ViewGroupA+ViewGroupB+ViewC ViewGroupA=View+View+View )
4.装饰器 ContextImpl 和 ContextWrapper
5.享元 查询语句的编译结果 SQLiteCompiledSql
6.代理 ActivityManagerProxy 代理了 ActivityManagerService 的 startActivity 等功能
7. 外观 Media FrameWork (多媒体框架的实现需要多个底层 library 的协同工作,但多媒体开发者只需要熟悉
android.media.MediaPlayer 类,它已经抽象出简单友好的接口)
行为模式
涉及对象之间任务的分配以及完成这些任务的算法
1.责任链 屏幕点击事件从父 View 传递到子 View
2.命令 EventBus
3.解释器 解析 AndroidManifest.xml
4.中介 XXManagerService , WindowManagerService , InputManagerService ,
APP 之间是跨进程通信,通过 Binder 实现
1.备忘录 Activity 的 onSaveInstanceState 和 onRestoreInstanceState
2.观察者 Broadcast Receiver ( 广播的订阅和发布,发布者和接收者解耦,方便扩展,从权限,时效到优先级,都可高度定制)
3.策略 Android Animation 中使用 Interpolator
4.模板 Activity 的生命周期
5. 状态 Wifi 状态,数据连接状态,蓝牙耳机状态
6. 迭代器 集合 Collection 实现了 Iterable 接口
7. 访问者 APT Dagger
Android 中的设计模式
架构
1)MVC (Model View Controller)
2)MVP (Model View Presenter)
MVC 模型
MVP 模型
MVC 和 MVP 的区别
• MVC • MVP
• 一定的解耦 • 更彻底的解耦 ( 适用业务变化快, UI 变更频
繁的情况,以及方便更好的分工)
• 有限的单元测试 • 更方便做单元测试(适用快速迭代的或者大
型的开发)
• 基于行为构造控制器,所以多个 View 视图
可以共用一个控制器
• 通常一个视图对应一个 presenter. 一个复杂
的视图可能对应多个 presenter.
• 控制器决定显示哪一个视图 • Presenter 将更新与之相关的视图
• 22
Thank You !

Weitere ähnliche Inhalte

Ähnlich wie 安卓中的设计模式举例 by hjm1fb

深入学习Mongo db
深入学习Mongo db深入学习Mongo db
深入学习Mongo dbLucien Li
 
An introduce to n hibernate (part 1) pub
An introduce to n hibernate (part 1) pubAn introduce to n hibernate (part 1) pub
An introduce to n hibernate (part 1) pubjiangxu
 
Js高级技巧
Js高级技巧Js高级技巧
Js高级技巧fool2fish
 
信息系统开发平台OpenExpressApp
信息系统开发平台OpenExpressApp信息系统开发平台OpenExpressApp
信息系统开发平台OpenExpressAppzhoujg
 
深入理解Andorid重难点
深入理解Andorid重难点深入理解Andorid重难点
深入理解Andorid重难点Bin Shao
 
OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发leneli
 
招聘笔试题(二)
招聘笔试题(二)招聘笔试题(二)
招聘笔试题(二)yiditushe
 
淘宝网前端开发面试题
淘宝网前端开发面试题 淘宝网前端开发面试题
淘宝网前端开发面试题 Lumend
 
Big Data, NoSQL, and MongoDB
Big Data, NoSQL, and MongoDBBig Data, NoSQL, and MongoDB
Big Data, NoSQL, and MongoDBMonster Supreme
 
软件工程 第十一章
软件工程 第十一章软件工程 第十一章
软件工程 第十一章浒 刘
 
MongoDB Basics and Tutorial
MongoDB Basics and TutorialMongoDB Basics and Tutorial
MongoDB Basics and TutorialHo Kim
 
软件设计原则、模式与应用
软件设计原则、模式与应用软件设计原则、模式与应用
软件设计原则、模式与应用yiditushe
 
事件驱动编程
事件驱动编程事件驱动编程
事件驱动编程banq jdon
 
Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Wade Huang
 
对“新软攀峰”官网项目中面向对象设计原则和包设计原则的分析与修改
对“新软攀峰”官网项目中面向对象设计原则和包设计原则的分析与修改对“新软攀峰”官网项目中面向对象设计原则和包设计原则的分析与修改
对“新软攀峰”官网项目中面向对象设计原则和包设计原则的分析与修改zhaoyulee
 
Nhibernate+sqlite測試實戰經驗分享
Nhibernate+sqlite測試實戰經驗分享Nhibernate+sqlite測試實戰經驗分享
Nhibernate+sqlite測試實戰經驗分享Wade Huang
 
使用 Dependency Injection 撰寫簡潔 C# 程式碼原來這麼簡單 (.NET Conf 2018)
使用 Dependency Injection 撰寫簡潔 C# 程式碼原來這麼簡單 (.NET Conf 2018)使用 Dependency Injection 撰寫簡潔 C# 程式碼原來這麼簡單 (.NET Conf 2018)
使用 Dependency Injection 撰寫簡潔 C# 程式碼原來這麼簡單 (.NET Conf 2018)Poy Chang
 
Big Java, Big Data
Big Java, Big DataBig Java, Big Data
Big Java, Big DataKuo-Chun Su
 
000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲ArBing Xie
 
Net 相依性注入 學習筆記 1.0
Net 相依性注入 學習筆記 1.0Net 相依性注入 學習筆記 1.0
Net 相依性注入 學習筆記 1.0智興 陳
 

Ähnlich wie 安卓中的设计模式举例 by hjm1fb (20)

深入学习Mongo db
深入学习Mongo db深入学习Mongo db
深入学习Mongo db
 
An introduce to n hibernate (part 1) pub
An introduce to n hibernate (part 1) pubAn introduce to n hibernate (part 1) pub
An introduce to n hibernate (part 1) pub
 
Js高级技巧
Js高级技巧Js高级技巧
Js高级技巧
 
信息系统开发平台OpenExpressApp
信息系统开发平台OpenExpressApp信息系统开发平台OpenExpressApp
信息系统开发平台OpenExpressApp
 
深入理解Andorid重难点
深入理解Andorid重难点深入理解Andorid重难点
深入理解Andorid重难点
 
OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发
 
招聘笔试题(二)
招聘笔试题(二)招聘笔试题(二)
招聘笔试题(二)
 
淘宝网前端开发面试题
淘宝网前端开发面试题 淘宝网前端开发面试题
淘宝网前端开发面试题
 
Big Data, NoSQL, and MongoDB
Big Data, NoSQL, and MongoDBBig Data, NoSQL, and MongoDB
Big Data, NoSQL, and MongoDB
 
软件工程 第十一章
软件工程 第十一章软件工程 第十一章
软件工程 第十一章
 
MongoDB Basics and Tutorial
MongoDB Basics and TutorialMongoDB Basics and Tutorial
MongoDB Basics and Tutorial
 
软件设计原则、模式与应用
软件设计原则、模式与应用软件设计原则、模式与应用
软件设计原则、模式与应用
 
事件驱动编程
事件驱动编程事件驱动编程
事件驱动编程
 
Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有
 
对“新软攀峰”官网项目中面向对象设计原则和包设计原则的分析与修改
对“新软攀峰”官网项目中面向对象设计原则和包设计原则的分析与修改对“新软攀峰”官网项目中面向对象设计原则和包设计原则的分析与修改
对“新软攀峰”官网项目中面向对象设计原则和包设计原则的分析与修改
 
Nhibernate+sqlite測試實戰經驗分享
Nhibernate+sqlite測試實戰經驗分享Nhibernate+sqlite測試實戰經驗分享
Nhibernate+sqlite測試實戰經驗分享
 
使用 Dependency Injection 撰寫簡潔 C# 程式碼原來這麼簡單 (.NET Conf 2018)
使用 Dependency Injection 撰寫簡潔 C# 程式碼原來這麼簡單 (.NET Conf 2018)使用 Dependency Injection 撰寫簡潔 C# 程式碼原來這麼簡單 (.NET Conf 2018)
使用 Dependency Injection 撰寫簡潔 C# 程式碼原來這麼簡單 (.NET Conf 2018)
 
Big Java, Big Data
Big Java, Big DataBig Java, Big Data
Big Java, Big Data
 
000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲
 
Net 相依性注入 學習筆記 1.0
Net 相依性注入 學習筆記 1.0Net 相依性注入 學習筆記 1.0
Net 相依性注入 學習筆記 1.0
 

安卓中的设计模式举例 by hjm1fb