创建型模式(5)
1 . 原型模式:通过复制一个已存在的对象来生成一个新的对象,被复制的对象称为原型;
注意:不会执行构造方法 ; 有深拷贝和浅拷贝之分
android 中intent.clone() new Intent(intent) 深拷贝;
2 .单例模式:一个类只有一个全局实例 推荐实现方式:静态内部类 ,枚举, 双重校验锁
android中Calendar.getInstance()
3 .生成器(builder)模式
android中AlertDialog采用的是生成器模式
4 .工厂方法模式:具体的工厂对象负责生产具体的产品对象
5 .抽象工厂方法:就是对一组具有相同主题的工厂进行封装;
android中BitmapFactory 采用的简单工厂模式
结构型模式(7)(涉及如何组合类和对象以获得更大的结构)
1 .装饰模式:通过关联机制给类增加行为,其行为的扩展由修饰对象来决定;
java 中 new BufferedReader(new FileReader(new File("test.txt"))).readLine(); BufferedReader是装饰类
2 .享元模式:大量细粒度对象共享复用,一般使用map保存对象,读取对象先读取map里面是否有该对象,没有才新建对象
android中对于retrofit的封装可以采用享元模式根据不同的host可以创建不同配置的Retrofit获取到接口
6 .桥接模式:将对象的行为抽象为接口(改变了对象与行为的强耦合)
7 .组合模式:组合模式组合多个对象形成树形结构以表示“整体-部分”的结构层次
android中View类似典型的组合模式
透明组合模式:所有的方法均在接口Component上声明:
安全组合模式:只在composite里面声明用来管理之类对象的方法
8 .外观模式:在子系统中的接口之上定义一个更高层次的接口,方便使用子系统的接口.
9 .代理模式:通过代理对象间接控制并访问目标对象的方法.
静态代理:代理类的.class文件在程序运行前就已经存在.
动态代理:在程序运行时,运用反射机制动态创建而成.
为什么有动态代理:从静态代理的实现方式来看,可以发现每一个代理类只能为一个接口服务,一个代理类实现了一个接口,要是我们有多个接口,需要写多个Proxy类与之对应.这样一来程序开发必然会产生过多的代理.而所有的代理操作除了调用的方法不一样之外,其他的操作都一样,则此时肯定是重复代码.解决这一问题最好的做法是可以通过一个代理类完成全部的代理功能,.那就引入了动态代理.
基于动态代理的剖面编程AOP:统计方法执行的时间,拦截方法判断是否登录
10:适配器模式:是将一种借口改造成另外一种借口的包装类.
android 中RecyclerView.Adapter, 这里的adapter就是用来适配data和view的
行为型模式(描述对象之间的通信方式)
1.解释器模式:定义一些语法规则,然后定义一个解释器去解析该语法(极少使用)
2.访问者模式:在不修改已有程序结构的前提下,通过添加额外的"访问者"来完成对已有代码功能的提升
适用场景:假如一个对象中存在着一些与本对象不相干(或者关系较弱)的操作,为了避免这些操作污染这个对象,则可以 使用访问者模式来把这些操作封装到访问者中去.
3.备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态
4.中介者模式:对象之前通过中介者对象进行交互,而不是直接交互
典型例子:聊天室(中介者)和具体的用户(通信对象)
5.模板方法模式:定义一个操作算法的骨架,而将一些操作步骤延迟到子类中
在android中, activity,和自己写的baseactivity中就相当于定义了一个一些操作骨架的抽象类,
6.责任链模式:为请求创建了一个接收者对象的链,每个接收者都包含对另一个接收者的引用,当某个接受者不能处理该请求时,会将该请求转给下一个接受者处理;
7.命令模式:将请求封装成命令对象,请求的具体执行由命令接受者执行;
8.状态模式:一个对象的行为根据其内部状态的改变自动变化;
9:策略模式:对象的行为,在不同的环境下,有不同的实现