下面举例介绍 Spring 中用到的设计模式:
1. 模板设计模式
模板设计模式是一个模板方法规定了算法骨架,包括步骤一、步骤二、步骤三等,在子类中可以修改这些步骤方法。其中抽象方法叫钩子方法。
如:一个人的人生包括生活、工作,但是每个人的生活方式、工作是不同的,可以使用模板模式。
abstract class People {
void lifetime() {
life();
work();
}
abstract void work();
abstract void life();
}
class APerson extends People {
@Override
void work() {
System.out.println("认真负责任工作");
}
@Override
void life() {
System.out.println("健康快乐生活");
}
}
class BPerson extends People {
@Override
void work() {
System.out.println("摸鱼");
}
@Override
void life() {
System.out.println("随意放浪");
}
}
public class Main {
public static void main(String[] args) {
APerson aPerson = new APerson();
aPerson.lifetime();
BPerson bPerson = new BPerson();
bPerson.lifetime();
}
}
Spring 中使用模板模式的地方有:
public class AbstractApplicationContext{
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
// 初始化 BeanFactory
refreshBeanFactory();
// 返回 BeanFactory
return getBeanFactory();
}
protected abstract void refreshBeanFactory() throws BeansException, IllegalStateException;
}
class AbstractRefreshableApplicationContext extends AbstractApplicationContext {
protected final void refreshBeanFactory() throws BeansException {
if (hasBeanFactory()) {
destroyBeans();
closeBeanFactory();
}
try {
DefaultListableBeanFactory beanFactory = createBeanFactory();
beanFactory.setSerializationId(getId());
customizeBeanFactory(beanFactory);
loadBeanDefinitions(beanFactory);
this.beanFactory = beanFactory;
}
catch (IOException ex) {
throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
}
}
}