前言:花了一个上午整理出来的设计模式+自己的一些理解,希望帮助你们能更好的结合实际场景理解设计模式,本文不讨论代码,关于设计模式的代码,网上有很多,本文只讨论理解~~
1:工厂方法模式:类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改(一般用静态工厂,直接类名.方法就行,不用实例化),这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到工厂方法模式,创建一个工厂接口和创建多个工厂实现类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。(springMVC中的bean工厂)
2:单例模式:springMVC中有,默认bean是singleton。保证类只有一个实例。单例模式注意几点:
1:采用了延时加载策略(懒汉式)和立即加载策略(饿汉式)。
2:构造器必须私有,不能让其实例化。
3:volatile保证有序性,禁止重排序。
4:单例模式对象静态化,因为静态方法访问静态成员变量。
5:双重检测。
3:原型模式:本质就是clone方法。
4:适配器模式:SpringMVC:前端控制器通过处理器映射器找到相对性的handler,但是handler有很多,调用需要的handler就要用if判断了。Springmvc创建了一个适配器接口,接口下有每个handler的适配器实现类,这样在扩展controller的时候,增加一个适配器就行。这样,前端控制器只需要调用处理器适配器即可。剩下的事情交给处理器适配器去适配。
5:装饰模式:io流。过滤流BufferedInputStream去装饰节点流(fileIuputstream)
6:代理模式:springMVC AOP。
7:门面模式(外观模式):化零为整。提供一个统一的接口去访问多个子系统的不同接口。例如spring ApplicationContext,他实现了factory,ResourceLoader等接口,对外统一提供:加载配置,解析资源,创建bean,提供环境,启动流程等功能。
8:组合模式:把一组相似的对象当做单一的对象。常用于树形结构中,例如二叉树。
9:享元模式:内存消耗比较大的时候可能用享元模式,比如数据库连接池。
10:策略模式:不同的国家,交税有不同的算法。其实就是java的多态,父类的引用指向子类的对象。
例如:排序一组猫。可以按照体重,身高,色差,年龄等排序,那我们就可以实现Comparator接口,定义一组身高比较器、体重比较器、年龄比较器等,比较的方法里面直接new出Comparator引用,但是实例化对象指向每个不同的比较器(不同的策略)。(AOP的代理不同策略,分为jdk动态代理(实现接口)和cglib代理)
12:观察者模式:redis做消息订阅发布。
13:责任链模式:有多个对象,每个对象持有对下一个对象的引用,这样就会形成一条链,请求在这条链上传递,直到某一对象决定处理该请求。
简述springMVC流程:在web.xml中部署DispaterServlet,并配置springmvc.xml等文件;
将映射文件请求到处理器HandlerMapping;
HandlerMapping会把请求映射为HandlerExecutionChain类型的handler对象;
将handler对象作为参数传递给HandlerAdapter的实例化对象,调用其handler方法会生成一个ModelAndView对象;
通过ViewResolver视图解析器,将上一步骤中生成的ModelAndView解析为View;
DispatcherServlet根据获取到View,将视图返回给用户
注:HandlerExecutionChain是由handler对象和拦截器组成。它将请求分配到链上注册的处理器执行。
14:备忘录模式:撤销快捷键,数据库事务的回滚。