1.工厂模式
这里学到了,简单工程,工厂方法,抽象工厂
在工厂方法&抽象工厂里面,用到了Interface作间接隔离
后2种,必须得在一定要的比较大的项目中才能感受到......,一看就是为了提高维护性,扩展性做的设计
spring底层bean注入也是抽象工厂
2.补习一下SE的知识
一个func,返回值为interfac名的时候,其实就是一个implements了以后的实现类
这样写没有错,没有问题,但是有一个缺点,不易维护,因为不是很直观的看懂,不像OC
OC里面不管是func还是api都比较长,很好看懂
类名作返回值类型:返回的是该类的对象
抽象类名作返回值类型:返回的是该抽象类的子类对象
接口名作返回值类型:返回的是该接口的实现类的对象
3.代理模式(静态)
写一个委托类
写一个代理类
通过构造方法,把委托类传到代理类,这样代理类就可以自己封装一个方法,把实际上委托类实现的,变成自己实现的......自己写代码给自己看,有时候确实有点搞不懂,这有啥意思...
4.动态代理
1.JDK自带动态代理
step:
1.new委托对象
2.传入委托对象,创建一个h andler
3.获得委托对象的classloader
4.获得委托对象的interfaces
5.强转成一个相同类的代理对象,传入值:
classLoader
interfaces
handler
最后强转,就得到了一个代理类
2.cglib动态代理
spring动态代理,是根据委托类是否有接口
来判断用Jdk动态代理,还是用cglib动态代理
Spring中
1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP
3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换
JDK动态代理只能对实现了接口的类生成代理,而不能针对类
CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法
5.建造者模式
SpringBuilder
有一点类似工厂,但是其对内部成员有要求,因为其内部成员是有关联的
注重零件装配的顺序
6.模板方法
其实这里就是一个减少复用,采用子类extends父类的这种方法,来通过重写,实现不同的业务
把相同的方法写在父类,然后不同实现的方法,在子类重写
这种用到的特别多
比如之前在Android上学习的BaseFragment,BaseActivity;NavigationBar这种类似的
7.适配器
这里的适配器,我个人觉得要写还是需要一定水平的
adapter起到了一个转换的作用,相当于桥梁作用
adapter太广泛了,很多都可以被称之为"adapter"
8.外观模式 / 门面模式
其实就是封装.......
9.原型设计模式
这里...实属不知道有哪些应用场景,在实际写代码的过程中,应该用到的不多,这里讲一些远离
实现cloneable接口以后
可以对数据进行:深克隆 & 浅克隆
demo:
有2个obj指向同一个data,这个data有2个值: string & ArrayList
当系统默认进行浅拷贝以后,obj1被obj2拷贝,只会copy基本类型,而不会copy引用类型,但是在这里string加了final,所以string是会被copy一份的,但是在这里因为默认的是浅拷贝,所以引用类型的arraylist不会被copy一份,而是obj2与obj1共享那一份;如果obj2是深拷贝的话,那么string和arraylist都是单独的一份,因为深拷贝为obj2开辟了一块新的内存地址.
所以,浅拷贝是2个obj共同引用一个数据,所以自然会有可能引起线程安全问题.
10.设计模式几个需要注意的地方
我个人来总结一下以上说的很多设计模式:
1.低耦合度 --> 用Interface这种,降低耦合度,提高内聚性
2.减少冗余代码,代码模块化,提高复用性
3.最好要具备一定的可扩展性,也就是要根据当前的业务,具备一定的策略性
4.有一些模式,需要隐藏本体,使用代理,我暂时不知道为什么要这样做.....自己写个自己看的代码,用这种模式不是自己逗自己吗?
5.关于extends和interface我觉得这2个东西都很好用,具体的话,看场景吧interface肯定通用性高一些