创建型:
工厂模式(Factory Pattern)
抽象工厂模式(Abstract Factory Pattern)
单例模式(Singleton Pattern)
建造者模式(Builder Pattern)
原型模式(Prototype Pattern)
结构型:
适配器模式(Adapter Pattern)
桥接模式(Bridge Pattern)
过滤器模式(Filter、Criteria Pattern)
组合模式(Composite Pattern)
装饰器模式(Decorator Pattern)
外观模式(Facade Pattern)
享元模式(Flyweight Pattern)
代理模式(Proxy Pattern)
行为型:
责任链模式(Chain of Responsibility Pattern)
命令模式(Command Pattern)
解释器模式(Interpreter Pattern)
迭代器模式(Iterator Pattern)
中介者模式(Mediator Pattern)
备忘录模式(Memento Pattern)
观察者模式(Observer Pattern)
状态模式(State Pattern)
空对象模式(Null Object Pattern)
策略模式(Strategy Pattern)
模板模式(Template Pattern)
访问者模式(Visitor Pattern)
工厂模式,创建复杂对象。
如Bitmap decodeResource Bitmap decodeFile
单例模式,类只有一个实例
如context.getSystemService
建造者模式,适用于初始化的对象比较复杂且参数较多的情况。
如AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setTitle("Title")
.setMessage("Message");
原型模式 ,拷贝对象 clone() 。
如intent bundle,避免引用避免改动了原对象。
适配器模式adapter
观察者模式 ,改变状态则所有依赖于它的对象都会得到通知并被自动更新。
如Recyclerview的notifyDataSetChanged
代理模式,适用于当无法或不想直接访问某个对象时通过一个代理对象来间接访问,为了保证客户端使用的透明性。
如:ContextWrapper
动态代理Proxy、spring、Retrofit
责任链模式,保证了事件的有序性和灵活。
如:view事件分发传递机制
策略模式,同一问题的多种处理方式。
如:animation.setInterpolator(new LinearInterpolator());
animation.setInterpolator(new AccelerateInterpolator());
备忘录模式,在对象之外保存保存对象的当前状态,并且在之后可以恢复到此状态。
如:onSaveInstanceState
桥接模式:
以咖啡大小杯和口味为例,不管是Coffee变化(大小杯),还是风味变化(CoffeeAdditives),其相对于对方而言都是独立的,两者唯一的联系就是Coffee中保持对coffeeAdditives的引用,为二者间的纽带,这就是桥接模式。
如:Listview和BaseAdapter
过滤器模式 filter
组合模式(Composite Pattern)表示对象的部分-整体层次结构
如:在Android的视图树中,容器一定是ViewGroup,只有ViewGroup才能包含其他View和ViewGroup。View是没有容器的。
装饰器模式 可以在不动用上层的情况下,直接下下级进行扩展,通过不同的包装类实现不同的功能。动态地给对象加入额外的职责
如:ContextWrapper和context
Context是一个全局应用环境接口,详细的实现由Android系统完毕。它能訪问应用资源,而且能够启动Activity,Service。接收broadcast。
它是一个抽象类,里面包括了各种方法的声明,应该将它作为一个接口类来看待。
ContextThemeWrapper这个是包括主题的装饰器,而Activity是它的子类。Application, Service, ReceiverRestrictedContext都是ContextWrapper的子类。
外观模式 要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行,就是封装
如:startActivity
享元模式 对象池的一种实现,主要目的是用来尽可能减少内存使用量。适合于存在大量重复对象的场景,来缓存可共享的对象,达到对象共享,避免创建过多对象的效果,这样可以提升性能。
如:String对象在第一次被定义后是缓存在常量池中的,当其他地方要用到的时候直接使用的是缓存,而不会重复创建。
Message,通过单链表这种方式一样实现了对象池的思想
命令模式 封装、队列、响应、事务
如:Thread的内部会调用Runnable的run(),Thread又充当了具体的命令角色,最后的Runnable则是接受者了,负责最后的功能处理。
Handler里面的 接受者:Handler,执行消息的处理操作。调用者:Looper,调用消息的的处理方法。命令角色:Message,消息类。
解释器模式 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
如:AndroidManifest.xml是由PackageManagerService使用了PackageParser这个类来解释的,这里面就用到了解释器模式。对于AndroidManifest.xml中的每一个标签,都有对应的类去保存相应的信息。
迭代器模式。又叫做游标(Cursor)模式,提供一种方法顺序访问一个容器对象中的各个元素,而又不需要暴露该对象的内部表示。
如:Iterator。Java中的Map、List等等容器,都使用到了迭代器模式。
sql的Cursor游标,cursor.moveToFirst(),cursor.moveToNext()
中介者模式。一个中介者对象来封装一系列的对象交互。中介者使得各对象不需要显式地相互引用。
如:Android中的锁屏功能就用到了中介者模式,KeyguardService(锁屏服务)通过KeyguardViewMediator(锁屏中介者)来协调各种Manager的状态以达到锁屏的功能。
状态模式,一个对象的内在状态改变时允许改变其行为。
如登录状态下和未登录状态、WIFI,蓝牙,网络连接等状态管理
空对象模式 Null对象模式的目的是最小化这种空检查。因此,我们经常将null对象实现为单例。使用空对象模式可以接受null,并返回相应的信息。
模板模式 定义一套流程下来的固定步骤。定义抽象类,使用实现。
如:View的draw方法中定义了一整套的绘制流程,这个流程是固定的,所有的Android中的View都是按照这个流程来绘制的。
Activity的生命周期,service、AsyncTask等等也是用到了模板方法模式
访问者模式 封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。增加新的操作很容易,就是增加一个新的访问者。
如:Android中编译期注解(依赖APT(Annotation Processing Tools)实现), 其内部就有使用访问者模式,元素结构是基本不变的Element及其子类(包元素PackageElement,类型元素TypeElement等)是被访问者,其中的accept方法接收一个ElementVisitor类型的访问者,ElementVisitor中有多个visit方法处理不同类型的元素, 比较著名的ButterKnife,Dagger,Retrofit等开源库都有使用编译期注解实现。