设计模式大家可能随口就能说出总共有23种,但是具体怎么用,或者在常用的组建中有哪些体现,这时候不一定说的上来了。接下来几篇文章,我们一起深入理解。首先我们一起了解下常用的组建中是怎么运用的,比如 JDK、Sring、Mybatis。
Java 开发人员想必非常熟悉Spring 框架--为我们节省很多基础的工作,是效率提升的利器。在开发之前呢,首先需要做的是系统设计或者说功能设计,这时候会遇到怎么实现的问题,我们一起参考下spring 这款优秀的框架。
回顾下Spring框架的核心模块划分:
Core Container(核心容器)
Beans:负责Bean工厂中Bean的装配,所谓Bean工厂即是创建
对象的工厂,Bean的装配也就是对象的创建工作;
Core:这个模块即是负责IOC(控制反转)最基本的实现;
Context:Spring的IOC容器,因大量调用Spring Core中的函数,
整合了Spring的大部分功能。Bean创建好对象后,由Context负责建立Bean与Bean之间的关系并维护。所以也可以把Context看成是Bean关系的集合;
SpEl:即Spring Expression Language(Spring表达式语言);
Data Access/Integration(数据访问/集成):
JDBC:对JDBC的简单封装;
ORM:支持数据集成框架的封装(如Mybatis,Hibernate);
OXM:即Object XML Mapper,它的作用是在Java对象和XML
文档之间来回转换;
JMS:生产者和消费者的消息功能的实现;
Transations:事务管理,不多BB;
Web:
WebSocket:提供Socket通信,web端的的推送功能;
Servlet:Spring MVC框架的实现;
Web:包含web应用开发用到Spring框架时所需的核心类,包括
自动载入WebApplicationContext特性的类,Struts集成类、文件上传的支持类、Filter类和大量辅助工具类;
Portlet:实现web模块功能的聚合(如网站首页(Port)下面可
能会有不同的子窗口(Portlet));
AOP:
面向切面;
Aspects:
同样是面向切面的一个重要的组成部分,提供对AspectJ框架的
整合;
Instrumentation(设备):
相当于一个检测器,提供对JVM以及对Tomcat的检测;
Messaging(消息):
Spring提供的对消息处理的功能;
01
简单工厂
又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。
简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。
Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。
02
工厂方法(Factory Method)
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
Spring中的FactoryBean就是典型的工厂方法模式。如下图:
03
单例(Singleton)
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
Spring中的单例模式完成了后半句话,即提供了全局的访问点BeanFactory。但没有从构造器级别去控制单例,这是因为Spring管理的是是任意的Java对象。
04
适配器(Adapter)
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
Spring中在对于AOP的处理中有Adapter模式的例子,见如下图:
由于Advisor链需要的是MethodInterceptor(拦截器)对象,所以每一个Advisor中的Advice都要适配成对应的MethodInterceptor对象。
05
包装器(Decorator)
动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。
Spring中用到的包装器模式在类名上有两种表现:一种是类名中含有Wrapper,另一种是类名中含有Decorator。基本上都是动态地给一个对象添加一些额外的职责。
06
代理(Proxy)
为其他对象提供一种代理以控制对这个对象的访问。
从结构上来看和Decorator模式类似,但Proxy是控制,更像是一种对功能的限制,而Decorator是增加职责。
Spring的Proxy模式在aop中有体现,比如JdkDynamicAopProxy和Cglib2AopProxy。
07
观察者(Observer)
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
Spring中Observer模式常用的地方是listener的实现。如ApplicationListener。
08
策略(Strategy)
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
Spring中在实例化对象的时候用到Strategy模式,见如下图:
在SimpleInstantiationStrategy中有如下代码说明了策略模式的使用情况:
09
模板方法(Template Method)
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
Template Method模式一般是需要继承的。这里想要探讨另一种对Template Method的理解。Spring中的JdbcTemplate,在用这个类时并不想去继承这个类,因为这个类的方法太多,但是我们还是想用到JdbcTemplate已有的稳定的、公用的数据库连接,那么我们怎么办呢?我们可以把变化的东西抽出来作为一个参数传入JdbcTemplate的方法中。但是变化的东西是一段代码,而且这段代码会用到JdbcTemplate中的变量。怎么办?那我们就用回调对象吧。在这个回调对象中定义一个操纵JdbcTemplate中变量的方法,我们去实现这个方法,就把变化的东西集中到这里了。然后我们再传入这个回调对象到JdbcTemplate,从而完成了调用。这可能是Template Method不需要继承的另一种实现方式吧。
以下是一个具体的例子:
JdbcTemplate中的execute方法:
JdbcTemplate执行execute方法:
本文我们一起了解了在Spring中使用的到的设计模式,下一篇我们一起看看在JDK中设计模式的运用。