OOA将问题域中客观存在的事物或概念识别为对象,建立分析模型
OOA的任务是“做什么”,OOD的任务是“怎么做”
先介绍在UML类图中,常见的有以下几种关系:
泛化(Generalization)带三角箭头的实线,箭头指向父类, 实现(Realization)带三角箭头的虚线,箭头指向接口,
关联(Association)带普通箭头的实心线,指向被拥有者(一对多),聚合(Aggregation)强的关联关系,可以离开主体,独立存在。带空心菱形的实心线,菱形指向整体,
组合(Composition)比聚合关系还要强的关系。带实心菱形的实线,菱形指向整体,依赖(Dependency)带箭头的虚线,指向被使用者;
各种关系的强弱顺序:
泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖
三类,可以用S、C、A(action)也可以用S、C、B(behavior)
decorater装饰 、observer、 singleton、 template method 、 visitor (dos cf)
chain of responsibility 、command 、composite
facade外观 、factory method、 flyweight
abstract factory adapter 、bridge builder 、iterator interpreter解释器 、mediator memento 、prototype proxy 、state strategy
责任链:使多个对象都有机会处理请求。android中的点击事件
抽象工厂:为创建一组相关或相互依赖的对象提供一个接口,而不需要制定他们的具体类。android中的service
工厂方法:定义一个创建对象的接口,让子类决定实例化哪个类。Android中的getSystemService()方法
单例:确保单例只有一个实例,提供一个接口让其他类获取。Android中的WindowManager
代理:为其他类提供一种代理,以控制这个对象的访问。Android中的AIDL自动生成。
建造者:将一个复杂对象的构造与它的表示分离,使得同样的构造过程可以创建不同的表示。Android中的AlertDialog.Builder
适配器:把一个类的接口变成客户端期待的另一个接口,从而使原本因接口不匹配而无法一起工作的两个类能够一起工作。Android中的ListView
桥接:将抽象部分与实现部分分离,使他们独立地进行变化。一个类存在二个纬度的变化,且这两个纬度都需要进行扩展。Android中的画View
命令:一系列操作,放入一个队列处理,可以撤退。
组合:将对象组成树形结构,以表示“部分-整体”的层次结构,使用户对单个对象和组合对象具有一致性。Android中的View与GroupView
装饰:动态的给一个对象添加额外的操作,就增加的新功能来说,Decorator比子类继承方式更灵活。Android中的Context
外观:要求一个子系统的外部与其内部的通讯必须通过一个统一的对象进行。Android中Context的这些复杂方法startActivity() sendBroadcast() bindService()
享元:使用享元对象有效的支持大量的细粒度对象。Java中的常量池、线程池。Android中的Message
解释器:给定一个语言,定义它的语法,并定义一个解释器。这个解释器用于解释语言。Android中的Manifest
迭代器:提供一个方法顺序访问一个容器对象中的各个元素,而不需要暴露该对象的内部表示。Android中的Cursor,moveToFirst(),moveToNext()
中介者:将系统从网状结构转为以调停者为中心的星型结构。Android中的Binder机制
备忘录:在不破坏封闭的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态。这样以后就可以将对象恢复到原理保存的状态中。Android中的onSaveInstanceState() onRestoreInstanceSate()
观察者:定义对象之间的对象关系,当1发生变化时,n全部得到通知,并更新。Android中ListView的notifyDataSetchanged()
状态:行为是由状态决定的,STATE的行为是平行的,不可替换的。Strategy的行为彼此独立可以相互替换。 Android中的WIFI模块关闭
策略:有一系列算法,将每个算法封装起来(每个算法可以封装到不同的类中),各个算法可以替换。Android中属性动画的 时间插值器。线性、减速、加速插值器
模版方法:定义一个操作中框架,而一些步骤延迟到子类中,使得子类可以不改变一个算法结构即可以从新定义该算法的特定步骤。Android中Activity开发者定制。onCreate() onStart(),这样子类不需要改变整体。
参观者:封装一些作用与某种数据结构中各个元素的操作,他可以在不改变这个数据结构的前提前定义作用与这些元素的新操作。Android编译注释中,APT(Animation Processing Tools) ButteKnife Dragger Retrofit
外观模式
定义:提供了一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层接口,让子系统更容易使用。
举例:我需要打开微信发送给某个好友某些内容,其中的过程包括了,下载微信,输入账号密码,点击登陆,找到好友,发送消息。这些整体封装成了一个对外的方法,当我调用需要这个流程的时候,我通过一个方法的调用,直接就能实现全部的流程,不需要在请求方,去组合方法去完成这个操作。
设计原则:迪米特法则(Law of Demeter)原则又称最少知识原则,只和你的密友谈话,通过“举例”,可以明白这个原则的定义。
原则缺点:采用这个原则会导致更多的”包装“对象被制造出来,以处理和其他组件的沟通,可能会导致复杂度和开发时间的增加,降低运行时性能
设计模式比较:外观模式,适配器模式,装饰者模式
适配器模式:当需要使用一个现有的类,但是接口并不符合要求,考虑使用适配器模式。将一个对象包装起来改变接口。
外观模式:当需要简化并统一一个/一群很大的接口的时候,考虑使用外观模式。依托与子系统执行。
装饰着模式:将一个对象包装起来,增加新的行为和责任。