Android中的23种设计模式
#⼀、单例模式# ##1、定义## ⼀个类只有⼀个实例,⽽且⾃⾏实例化,并向整个系统提供这个实例。
##2、使⽤场景## 避免多个对象消耗过多资源;创建⼀个对象需要消耗过多资源;如,访问I/O、访问数据库等。
##3、Android中的单例模式## LayoutInflater、Application
##4、更多参考##
#⼆、Builder模式# ##1、定义## 将⼀个复杂对象的构建与它的表⽰分离,使得同样的构建过程可以创建不同的表⽰。
##2、使⽤场景##
1. 相同的⽅法,不同的执⾏顺序,产⽣不同的事件结果时;
2. 多个部件,都可以装配到⼀个对象中,但是产⽣的运⾏结果⼜不同;
3. 产品类⾮常复杂,或者产品类中的调⽤顺序不同产⽣了不同的作⽤;
4. 初始化⼀个对象特别复杂,如参数很多。
##3、Android中的Builder模式## AlertDialog.Builder
##4、更多参考##
#三、原型模式模式# ##1、定义## ⽤原型实例指定创建对象的类,并通过复制(克隆)这些原型创建新的对象。 类似C++中的复制构造函数。
##2、使⽤场景##
1. 类初始化需要消耗⾮常多的资源,通过原型复制可以避免这些消耗;
2. 通过new产⽣⼀个对象需要⾮常繁琐的数据准备或访问权限;
3. ⼀个对象需要提供给其他对象访问,⽽且各个调⽤者可能都需要修改其值时,可以使⽤原型模式复制多个对象共调⽤者使⽤,即保护
性拷贝(Defensive Copy)。
##3、Android中的原型模式## Intent
#四、⼯⼚⽅法模式# ##1、定义## 定义⼀个⽤于创建对象的接⼝,让⼦类决定实例化哪个类。
##2、使⽤场景## 在任何需要⽣产复杂对象的地⽅,都可以使⽤⼯⼚⽅法模式。
##3、Android中的⼯⼚⽅法模式## Activity中的OnCreate()⽅法
#五、抽象⼯⼚⽅法模式# ##1、定义## 为创建⼀组相关或者是相互依赖的对象提供⼀个接⼝,⽽不需要指定它们的具体类。
##2、使⽤场景## 例如,⽤抽象⼯⼚⽅法模式来产⽣Android、iOS下的拨号、短信程序。
##3、Android中的抽象⼯⼚⽅法模式## MediaPlayer
#六、策略模式# ##1、定义## 策略模式定义了⼀些列的算法,并将每⼀个算法封装起来,⽽且使它们还可以相互替换。策略模式让算法独⽴于使⽤它的客户⽽独⽴变化。
##2、使⽤场景##
1. 针对同⼀类型问题的多种处理⽅式,仅仅是具体⾏为有差别;
2. 需要安全地封装多种同⼀类型的操作;
3. 出现同⼀抽象类有多个⼦类,⽽⼜需要使⽤if-else或者switch-case来选择具体⼦类。
##3、Android中的策略模式## ⽤于动画的时间插值器,Time Interpolator
#七、状态模式# ##1、定义## 当⼀个对象的内在状态改变时允许改变其⾏为,这个对象看起来像是改变了其类。
##2、使⽤场景##
1. ⼀个对象的⾏为取决于它的状态,并且它必须在运⾏时根据状态改变它的⾏为;
2. 代码中包含⼤量与这些对象状态有关的条件语句,并且这些分⽀依赖于该对象的状态。
##3、Android中的状态模式## WiFi管理
#⼋、责任链模式# ##1、定义## 使多个对象都有机会处理请求,从⽽避免了请求的发送者和接受者之间的耦合。将这些对象连城⼀条链,并沿着这条链传递该请求,直到有对象处理它为⽌。
##2、使⽤场景##
1. 多个对象可以处理同⼀个请求,但具体由哪个对象处理则在运⾏时动态决定;
2. 在请求处理中不明确的情况下向多个对象中的⼀个提交⼀个请求;
3. 需要动态指定⼀个组对象处理请求。
##3、Android中的责任链模式## 对触屏事件(onTouchEvent)的分发、有序⼴播(Orderd Broadcast)
#九、解释器模式# ##1、定义## 给定⼀个语⾔,定义它的⽂法的⼀种表⽰,并定义⼀个解释器,该解释器使⽤该表⽰来解释语⾔中的句⼦。
##2、使⽤场景##
1. 如果某个简单的语⾔需要解释执⾏⽽且可以将语⾔中的语句表⽰为⼀个抽象语法树时;
2. 在某些特定的领域出现不断重复的问题时, 可以将该领域的问题转化为⼀种语法规则下的语句,然后构建解释器来解释该语句。
##3、Android中的解释器模式## PackageParser类,⽤于读取l
#⼗、命令模式# ##1、定义## 将⼀个请求封装成⼀个对象,从⽽让⽤户使⽤不同的请求把客户端参数化;对请求进⾏排队或者对请求⽇志进⾏记录,以及⽀持可撤销的操作。
##2、使⽤场景##
1. 需要抽象出待执⾏的动作,然后以参数的形式提供出来;
2. 在不同的时刻指定、排列和执⾏请求;
3. 需要⽀持取消操作;
4. 需要⽀持事务操作;
5. ⽀持修改⽇志功能,这样当系统崩溃时,这些修改可以被重做⼀遍。
##3、Android中的命令模式## 事件机制中,对事件的转发处理
alertdialog使用方法#⼗⼀、观察者模式# ##1、定义## 定义对象间⼀种⼀对多的依赖关系,使得每当⼀个对象改变状态时,所有依赖于它的对象都会得到通知并被⾃动更新。
##2、使⽤场景##
1. 关联⾏为场景,需要注意的是,关联⾏为是可拆分的,⽽不是“组合”关系;
2. 事件多级触发场景;
3. 跨系统的消息交换场景,如消息队列、事件总线的处理机制。
##3、Android中的观察者模式## ListView中Adapter的notifyDataSetChanged()⽅法、BroadcastReceiver的onReceive()⽅法
#⼗⼆、备忘录模式# ##1、定义## 在不破坏封闭的前提下,捕获⼀个对象的内部状态,并在该对象之外保存这个状态,这样,以后就可以将该对象恢复到原先保存的状态。
##2、使⽤场景##
1. 需要保存⼀个对象在某⼀时刻的全部或部分状态;
2. 如果⽤⼀个接⼝来让其他对象得到这些状态,将会暴露对象的实现细节并破坏对象的封装性,⼀个对象不希望外界直接访问其内部状
态,通过中间对象可以间接访问其内部状态。
##3、Android中的备忘录模式## Activity中的状态保存与恢复,即onSaveInstanceState()和onRestoreInstanceState()⽅法
#⼗三、迭代器模式# ##1、定义## 提供⼀种该⽅法顺序访问⼀个容器对象中的各个元素,⽽⼜不需要暴露该对象的内部表⽰。
##2、使⽤场景##
遍历⼀个容器对象时。
##3、Android中的迭代器模式## 使⽤SQLite Database的query⽅法查询数据库时,返回的Cursor游标对象
#⼗四、模板⽅法模式# ##1、定义## 定义⼀个操作中的算法的框架,⽽将⼀些步骤延迟到⼦类中,使得⼦类可以不改变⼀个算法的结构即可重定义该算法的某些特定步骤。
##2、使⽤场景##
1. 多个⼦类有公有的⽅法,并且逻辑基本相同时;
2. 重要、复杂的算法,可以把核⼼算法设计为模板⽅法,周边的相关细节功能则由各个⼦类实现;
3. 重构时,模板⽅法模式是⼀个经常使⽤的模式,把相同的代码抽取到⽗类中,然后通过钩⼦函数约束其⾏为。
##3、Android中的模板⽅法模式## AsyncTask类、Activity的各个⽣命周期函数
#⼗五、访问者模式# ##1、定义## 封装⼀些作⽤于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下定义作⽤于这些元素的新的操作。
##2、使⽤场景##
1. 对象结构⽐较稳定,但经常需要在此对象结构上定义新的操作;
2. 需要对⼀个对象结构中的对象进⾏很多不同的并且不相关的操作,⽽需要避免这些操作“污染”这些对象的类,也不希望在增加新操
作时修改这些类。
##3、Android中的访问者模式## 编译器注解
#⼗六、中介者模式# ##1、定义## 中介者模式包装了⼀些列对象相互作⽤的⽅式,使得这些对象
不必相互明显作⽤,从⽽使它们可以松散耦合。当某些对象之间的作⽤发⽣改变时,不会⽴即影响其他的⼀些对象之间的作⽤,保证这些作⽤可以彼此独⽴变化。中介者模式将多对多的相互作⽤转化为⼀对多的相互作⽤。
##2、使⽤场景##
当对象之间的交互操作很多且每个对象的⾏为操作都依赖彼此时,为防⽌在修改⼀个对象的⾏为时,同时设计修改很多其他对象的⾏为,可采⽤中介者模式来解决紧耦合问题。中介者对象将系统从⽹状结构变成以调停者为中⼼的星状结构。
##3、Android中的中介者模式## 锁屏KeyguardViewMediator类、Binder机制
#⼗七、代理模式# ##1、定义## 为其他对象提供⼀种代理以控制对这个对象的访问。##2、使⽤场景##
当⽆法或不想直接访问某个对象或访问某个对象存在困难时可以通过⼀个代理对象来间接访问,为了保证客户端使⽤的透明性,委托对象与代理对象需要实现相同的接⼝。
##3、Android中的代理模式## ActivityManagerProxy类
#⼗⼋、组合模式# ##1、定义## 将对象组合成树形结构以表⽰“部分-整体”的层次结构,使得⽤户对单个对象和组合对象的使⽤具有⼀致性。
##2、使⽤场景##
1. 表⽰对象的部分-整体层次机构时;
2. 从⼀个整体中能够独⽴出部分模块或功能的场景。
##3、Android中的组合模式## View和ViewGroup的组合
#⼗九、适配器模式# ##1、定义## 适配器模式把⼀个类的接⼝变换成客户端所期待的另⼀种接⼝,从⽽使原本因接⼝不匹配⽽⽆法在⼀起的两个类能够在⼀起⼯作。
##2、使⽤场景##
1. 系统需要使⽤现有的类,⽽此类的接⼝不符合系统的需要,即接⼝不兼容;
2. 想要建⽴⼀个可以重复使⽤的类,⽤于与⼀些彼此之间没有太⼤关联的⼀些类,包括⼀些可能在将来引进的类⼀起⼯作;
3. 需要⼀个统⼀的输出接⼝,⽽输⼊端的类型不可预知。
##3、Android中的适配器模式## ListView的Adapter
#⼆⼗、装饰模式# ##1、定义## 动态地给⼀个对象添加⼀些额外的职责。就增加功能来说,装饰模式⽣产⼦类更为灵活。
##2、使⽤场景##
需要透明且动态地扩展类的功能时。
##3、Android中的装饰模式## Context类
#⼆⼗⼀、享元模式# ##1、定义## 使⽤共享对象可以有效地⽀持⼤量的细粒度的对象。
##2、使⽤场景##
1. 系统中存在⼤量的相似对象;
2. 细粒度的对象都具备较接近的外部状态,⽽且内部状态与环境⽆关,也就是说对象没有特定⾝份;
3. 需要缓冲池的场景。
##3、Android中的享元模式## 消息队列中的Message类
#⼆⼗⼆、外观模式# ##1、定义## 要求⼀个⼦系统的外部与其内部的通信必须通过⼀个统⼀的对象进⾏。外观模式提供⼀个⾼层次的接⼝,使得⼦系统更易于使⽤。
##2、使⽤场景##
1. 为⼀个复杂⼦系统提供⼀个简单的接⼝;
2. 当需要构建⼀个层次结构的⼦系统时,使⽤外观模式定义⼦系统中每层的⼊⼝点。
##3、Android中的外观模式## ContextImpl类
#⼆⼗三、桥接模式# ##1、定义## 将抽象部分与实现部分分离,使它们都可以独⽴地进⾏变化。
##2、使⽤场景##
1. 如果⼀个系统需要在构件的抽象化⾓⾊和具体化⾓⾊之间增加更多的灵活性,避免在两个层次之间建⽴静态的集成联系,可以通过桥
接模式使它们在抽象层建⽴⼀个关联关系。
2. 对于那些不希望使⽤集成或因为多层次继承导致系统类的个数急剧增加的系统,也可以考虑使⽤桥接模式;
3. ⼀个类存在两个独⽴变化的维度,且这两个维度都需要进⾏扩展。
##3、Android中的桥接模式## Adapter和AdapterView之间、Window和WindowManager之间
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论