Java设计模式的常见应⽤场景
⼀、Java I/O中的设计模式
1、适配器模式
适配器模式就是把⼀个类的接⼝变换成客户端所能接受的另⼀种接⼝,从⽽使两个接⼝不匹配⽽⽆法在⼀起⼯作的两个类能够在⼀起⼯作。通常被⽤在⼀个项⽬需要引⽤⼀些开源框架来⼀起⼯作时,这些框架的内部都有⼀些关于环境信息的接⼝,需要从外部引⼊,但是外部的接⼝不⼀定能匹配,在这种情况下,就需要适配器模式来转换接⼝。
Java的I/O类库中有许多这样的需求,如将字符串转成字节数据保存到⽂件中,将字节数据变成数据流等。具体来
说,InputStreamReader和OutputStreamWriter就是适配器的体现。InputStreamReader实现了Reader接⼝,并且持有InputStream 的引⽤,其作⽤是将InputStream适配到Reader。源⾓⾊就是InputStream代表的实例对象,⽬标⾓⾊就是Reader类。OutputStreamWriter也是类似的⽅式。
2、装饰器模式
装饰器的作⽤是使得被装饰者功能更强⼤,⽽且装饰前后的使⽤⽅式不变。Java I/O类库中有许多不同的功能组合情况,这些不同的功能组合都是使⽤装饰器模式实现的。以FileInputStream为例,其类结构如下:
由于java I/O库需要很多性能的各种组合,如果这些性能都是⽤继承来实现,那么每⼀种组合都需要⼀个类,这样就会造成⼤量⾏重复的类出现。如果采⽤装饰模式,那么类的数⽬就会⼤⼤减少,性能的重复也可以减⾄最少。因此装饰模式是java I/O库基本模式。装饰模式的引进,造成灵活性和复杂性的提⾼。因此在使⽤ java I/O 库时,必须理解java I/O库是由⼀些基本的原始流处理器和围绕它们的装饰流处理器所组成的。
InputStream类是以抽象组件的形式存在,⽽FileInputStream就是具体组件,它实现了抽象接⼝的所有⽅法,并且持有InputStream对象的引⽤。FileInputStream就是⼀个装饰类,⽽BufferInputStream是这个装饰类的具体实现者,它给InputStream加⼊了新的功能,使得InputStream读取的数据保存在内存中,从⽽提⾼读取性能。
3、适配模式和装饰模式的区别
适配模式是为了处理两个借⼝不⼀致,改变现有接⼝使其匹配。
装饰模式是在不改变现有接⼝的前提下,加⼊新的功能。
⼆、Javac中的访问者模式java怎么编写
javac 是java语⾔编程编译器。全称javacompilation。javac⼯具读由java语⾔编写的类和接⼝的定义,
并将它们编译成字节代码的class ⽂件。javac 可以隐式编译⼀些没有在命令⾏中提及的源⽂件。⽤ -verbose 选项可跟踪⾃动编译。当编译源⽂件时,编译器常常需要它还没有识别出的类型的有关信息。对于源⽂件中使⽤、扩展或实现的每个类或接⼝,编译器都需要其类型信息。这包括在源⽂件中没有明确提及、但通过继承提供信息的类和接⼝。
Javac的编译过程涉及许多语法分析,所有就有语法分析器、语义分析器和代码⽣成器,期间需要多次遍历语法树。然⽽每次遍历语法树都会进⾏不同的处理动作,这是如何实现的呢?就是通过采⽤访问者模式设计的,每次遍历都是⼀次访问者的执⾏过程。
访问者模式可以使数据结构和对数据结构的操作解耦,使得增加对数据结构的操作不需要去修改数据结构,也不必去修改原有的操作,从⽽执⾏时再定义新的Visitor实现者就⾏了。在Javac中不同的编译阶段都定义了不同的访问者模式实现。
三、Tomcat中的设计模式
1、门⾯模式
Tomcat中门⾯设计模式使⽤得很多,因为Tomcat中有很多组件,每个组件要相互交互数据,⽤门⾯设计模式隔离数据是个很好的⽅法。
可以看到,HttpRequestFacade类封装了HttpRequest接⼝,能够提供数据,通过HttpRequestFacade访问到的数据被代理到HttpReauest中、通常被封装的对象都被设为Private或者Protectd的,防⽌在Facade中直接访问。
2、观察者模式
Tomcat中观察者模式也有多处使⽤,前⾯讲的控制组件⽣命周期的Lifecycle就是这 种模式的体现,还有对Servlet实例的创建、Session 的管理、Container等都是同样的原理。 下⾯主要看⼀下Lifecycle的具体实现。
Lifecycle的观察者模式结构图如图所⽰。
在上⾯的结构图中,LifecycleListener代表的是抽象观察者,它定义⼀个lifecycleEvent ⽅法,这个⽅法就是当主题变化时要执⾏的⽅法。ServerLifecycleListener代表的是具体的 观察者,它实现了 LifecycleListener接⼝的⽅法,就是这个具体的观察者具体的实现⽅式。 Lifecycle接⼝代表的是抽象主题,它定义了管理观察者的⽅法和它所要做的其他⽅法。⽽ StandardServer代表的是具体主题,它实现了抽象主题的所有⽅法。这⾥Tomcat对观察者 做了扩展,谓加了另外两个类:LifecycleSupport和LifecycleEvent,它们作为辅助类扩展 了观察者的功能。LifecycleEvent使得可以定义事件类别,不同的事件可区别处理,更加灵活。LifecycleSupport类代理了主题对多观察者的管理,将这个管理抽出来统⼀实现,以 后如采修改只要修改LifecycleSupport类就可以了,不需要去修改所有的具体主题,因为所有具体主题对观察者的操作都被代理给LifecycleSupport类了。这可以认为是观察者模式的改进版。
3、命令设计模式
Tomcat中命令模式在Connector和Container组件之间有体现,Tomcat作为⼀个应⽤ 服务器,⽆疑会接收到很多请求,如何分配和执⾏这些请求是必须的功能。
下⾯分析⼀下Tomcat是如何实现命令模式的,下图是Tomcat命令模式的结构图。
Connector作为抽象请求者,HttpConnector作为具体请求者。HttpProcessor作为命令。 Container作为命令的抽象接受
者,ContainerBase作为具体的接受者。客户端就是应⽤服务器Server组件了。Server⾸先创建命令请求者HttpConnector对象,然后创建命令 HttpProcessor对象。再把命令对象交给命令接受者ContainerBase容器来处理,命令最终是被Tomcat的Container执⾏的。命令可以以队列的⽅式进来,Container也可以以不同的 ⽅式来处理请求,如HTTP1.0协议和HTTP1.1的处理⽅式就不同。
4、责任链模式
Tomcat 中⼀个最容易发现的设计模式就是责任链设计模式,这个设计模式也是 Tomcat 中 Containe设计的基础,整个容器就是通过⼀个链连接在⼀起的,这个链⼀直将请求正确地传递给最终处理请求的那个 Servlet 。在Tomcat中这种设计模式⼉乎被完整地使⽤,Tomcat 的容器设置就是责任链模式,从Engine到Host再到Cortex,⼀直到Wrapper都通过这个链传递请求。
四、Spring中的设计模式
1、简单⼯⼚模式
⼜叫做静态⼯⼚⽅法(StaticFactory Method)模式,但不属于23种GOF设计模式之⼀。
简单⼯⼚模式的实质是由⼀个⼯⼚类根据传⼊的参数,动态决定应该创建哪⼀个产品类。
spring中的BeanFactory就是简单⼯⼚模式的体现,根据传⼊⼀个唯⼀的标识来获得bean对象,但是否是在传⼊参数后创建还是传⼊参数前创建这个要根据具体情况来定。如下配置,就是在 HelloItxxz 类中创建⼀个 itxxzBean。
<beans>
<bean id="singletonBean"class="com.kang.HelloItxxz">
<constructor-arg>
<value>Hello! 这是singletonBean!value>
</constructor-arg>
</ bean>
<bean id="itxxzBean"class="com.kang.HelloItxxz"
singleton="false">
<constructor-arg>
<value>Hello! 这是itxxzBean! value>
</constructor-arg>
</bean>
</beans>
2、⼯⼚⽅法模式
通常由应⽤程序直接使⽤new创建新的对象,为了将对象的创建和使⽤相分离,采⽤⼯⼚模式,即应⽤程序将对象的创建及初始化职责交给⼯⼚对象。
⼀般情况下,应⽤程序有⾃⼰的⼯⼚对象来创建bean.如果将应⽤程序⾃⼰的⼯⼚对象交给Spring管理,那么Spring管理的就不是普通的bean,⽽是⼯⼚Bean。
以⼯⼚⽅法中的静态⽅法为例讲解⼀下:
import java.util.Random;
public class StaticFactoryBean {
public static Integer createRandom() {
return new Integer(new Random().nextInt());
}
}
建⼀个配置⽂件,将其纳⼊Spring容器来管理,需要通过factory-method指定静态⽅法名称,createRandom⽅法必须是static 的,才能到
<bean id="random"
class="example.chapter3.StaticFactoryBean" factory-method="createRandom"scope="prototype"
/>
3、单例模式
保证⼀个类仅有⼀个实例,并提供⼀个访问它的全局访问点。
spring中的单例模式完成了后半句话,即提供了全局的访问点BeanFactory。但没有从构造器级别去控制单例,这是因为spring管理的是是任意的java对象。 Spring下默认的bean均为singleton,可以通过singleton=“true|false” 或者 scope=“?”来指定
4、代理模式
在Spring的Aop中,使⽤的Advice(通知)来增强被代理类的功能。Spring实现这⼀AOP功能的原理就使⽤代理模式(1、JDK动态代理。2、CGLib字节码⽣成技术代理。)对类进⾏⽅法级别的切⾯增强,即,⽣成被代理类的代理类, 并在代理类的⽅法前,设置,通过执⾏重的内容增强了代理⽅法的功能,实现的⾯向切⾯编程。
5、模板⽅法模式
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论