Android中的设计模式

参考:http://www.cnblogs.com/qianxudetianxia/category/312863.html

http://www.cnblogs.com/beijiguangyong/archive/2010/11/15/2302807.html


各种模式例子:

工厂:

包括 IProduct,Product,IFactory,Factory等

BitmapFactory产生Bitmap,参数型工厂

ThreadFactory

Connection

自己实现就是Factory产生Product,具体产生过程由工厂封装


设计模式之简单工厂(client摆了产品生成的细节,工厂类根据参数生成不同的产品)

简单来说就是包括

工厂类

产品接口

产品类


工厂方法则包括(抽象了工厂,让工厂类决定实例化具体的产品,判断生成不同产品的代码转移到了client中)

工厂接口

工厂类

产品接口

产品类


抽象工厂中的产品更复杂,包括(具有多种抽象产品)

工厂接口

工厂类

产品接口一

产品接口二(不同产品族)

产品类一 1 产品类一2

产品类二


策略:

Context,IStrategy,Strategy1,Strategy2

Collections.sort中的cmp排序方法就可以理解为自定义的策略

android中的animation设置Interpolator时,有AccelerateInterpolator等策略

ISort接口,然后实现各种算法,这就是策略模式,策略共同点是有一个共同的行为,但有不同的规则算法,方便单元测试

依赖注入各种策略,设置缺省策略


装饰:

IComponent,Component,IDecorator,Decorator1,Decorator2

将新加入的功能封装为一个类,并包装和继承原有的对象,相比直接修改原类来增加少部分功能需求,简化了原有类


代理:

ISubject,RealSubject,Proxy

远程代理,虚拟代理,安全代理,动态代理


原型:

IClone,Clone

注意浅copy与深copy

例Intent是Cloneable


模板:

AFather,Son1,Son2

父类定义抽象方法,延迟到子类实现;父类中有一个模板方法,包含了抽象方法的执行(相当于模板),client使用子类实例执行该模板方法

优点是代码复用,模板方法是不变的,具体的某一步是子类中改变的

例View中的draw,子类实现onDraw


外观:

Facade,SubSystem1,SubSystem2

Facade中有各子系统的对象,client只用操作外观类,就可以实现一系列功能,将上层应用与底层功能分享开来,实现层次结构

例经常写的Manager类实现各种功能,屏蔽各种细节


建造者:

封装建造细节与过程,只考虑类型或参数,

IBulider,Builder,Director,Product

例AlertDialog.Builder类似


观察者:

IObserver,Observer,ISubject,Subject

attach,detach,notify,update

一个对象的改变会引起连锁反应(引起多个其他对象的变化时)

例ContentObserver,广播


状态:

Context,IState,State1,State2

与策略模式很像,但状态中的State子类可以设置状态的迁移,修改Context属性,切换状态,从而action一个流程;策略模式由client设置具体策略,从而产生不同action


适配器:

IAdapter,Adapter,Adaptee

为复用已有类,适配原有接口

例ArrayAdapter,CursorAdapter为了适配数据源List,Cursor,继承BaseAdapter以适配各种数据


备忘录:

Originator,Memento,Caretaker

Originator负责创建和恢复,Memento只涉及需要备忘的信息,Caretaker负责持有备忘对象

将复杂的备忘机制封装了,但Memento的信息越多,带来的内存成本越大

例canvas中的save,restore


组合:

Root,View,ViewGroup都来自Root

例View,ViewGroup中的方法有add,remove,getChildAt

整体和部分,多个部分组合后仍然来源于整体;需要忽略组合对象和个体对象的差异

例View,ViewGroup


迭代器:

IIterator,Iterator,List,ArrayList

对聚合类对象遍历的模式,封装了遍历的细节

例List


单例:

全局只有一个对象

例getSystemService中得到的Manager

与工具类区别:

工具类只提供静态属性或方法,单例有状态,单例可以继承多态



桥接:

继承在编译时确定,带来了设计的局限性(修改父类会引起很大变化),优先使用合成/聚合关系,然后再考虑继承

//

Abstraction,RefinedAbstraction,Implementor,ConcreateImplementor1,2

Abstraction中包含Implementor

将多个角度抽离出来,利用抽象搭桥


命令:

ICommand,Command,Receiver,Invoker

将命令与命令执行者分开,容易增加新的命令,将Receiver的操作行为或参数封装为命令,方便组建复合命令或命令队列,方便记录日志,Receiver可以选择是否执行该命令

例Thread,Runnable


责任链:

AbsHandler,Handler1,Handler2

IHandler中有一个表示nextHandler的对象,指示了下一个处理者

例Handler,从Looper中得到MessageQueue,然后按顺序handleMessage

每个Handler不需要保存所以对象,而只需要知道下一个责任人,类似链表的结构,简化了操作,client在设置好责任链后,只需要操作"表头"


中介者:

IMediator,Mediator,IColleague,Colleague1,Colleague2

中介者减少了同事间的耦合,但中介者自身增加了复杂度,类似星形组网中的交换机

优点:方便多对多借助中介互相交互,集中化控制;缺点:中介者的复杂带来的修改成本


享元:

FlyweightFactory,IFlyweight,Flyweight1,Flyweight2

使用了大量对象的情况下,且对象间差异较小(在使用对象时修改外部参数),利用Flyweight可以共享空间,缺点是:增加了系统复杂度

例SQLiteCompiledSql,String


解释器:

Context,AbsExpression,TerminalExpression,NonTerminalExpression

例正则表达式,浏览器,XML中的SAX解析或解析自定义协议

一条规则就是一个类,通过递归解释实现语言的解释,但文法复杂时会增加复杂度


访问者:

IVisitor,Visitor1,Visitor2,IElement,Element1,Element2

双分派,Element中有个带Visitor参数的accept方法,Visitor中有针对不同Element的访问方法,client调用时可以从不同Element根据不同Visitor的访问来执行得到相应的action

访问者适合有稳定数据结构,但算法变化较大的系统,增加新的操作就增加一个访问者,


创建型模式:

单例,工厂,创建,原型

从工厂方法开始设计,向其他形式演变

结构型模式:

适配,桥接,组合,装饰,外观,享元,代理

行为型模式:

模版,中介,观察,访问,命令,责任,策略,迭代,解释,备忘,状态



更多相关文章

  1. 类和 Json对象
  2. Android线程间通信的Message机制
  3. Android开发之文件下载
  4. Android的线程使用来更新UI----View的几种更新方法(Thread、Hand
  5. Android中如何使用Intent在Activity之间传递对象[使用Serializab
  6. Android中的Data Binding初探 (三)
  7. Binder驱动的实现
  8. Android持久化之SharedPreferences
  9. Android之Handler用法总结

随机推荐

  1. Android 手势滑动切换activity
  2. Android 打开和关闭软键盘
  3. android系统自带的Service原理与使用(转)
  4. android获取手机电量
  5. FrameLayout 上下层点击穿透
  6. 快捷方式工具类
  7. Android中图片的放大和缩小源码
  8. Android文件读写
  9. 为手机定制ROM
  10. View的XML 属性大全(官方文档)