Android中的设计模式(结合大话设计模式+网上博客)

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

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


创建型模式:

单例,工厂,创建,原型

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

结构型模式:

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

行为型模式:

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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值