4 ioC用到的那些设计模式
引言:
为什么要讲设计模式(不是源码课程吗?)
1、Spring中使用了大量的设计模式
2、如果不懂设计模式,你肯定读不懂(部分)Spring的源码,原因就是你打断点跟到某一行,值就初始化完了,究竟在哪里初始化完的?你找不到,为什么,因为你不懂设计模式,找不到那个地方设计模式怎么讲?
剖析spring源码过程中; 遇到一个设计模式,就讲一个设计模式
4.1 设计模式之工厂
工厂模式(Factory Pattern)提供了一种创建对象的最佳方式。
工厂模式(Factory Pattern)分为三种
1、简单工厂
2、工厂方法
3、抽象工厂
4.1.1 简单工厂模式
ApplicationContext context =new ClassPathXmlApplicationContext("classpath*:application.xml");\ UserService userService = context.getBean(UserService.class);
简单工厂模式对对象创建管理方式最为简单,因为其仅仅简单的对不同类对象的创建进行了一层简单的
封装
定义接口IPhone
public interface Phone { void make(); }
实现类
public class IPhone implements Phone { public IPhone() { this.make(); } @Override public void make() { // TODO Auto-generated method stub System.out.println("生产苹果手机!"); } }
实现类
public class MiPhone implements Phone { public MiPhone() { this.make(); } @Override public void make() { // TODO Auto-generated method stub System.out.println("生产小米手机!"); } }
定义工厂类并且测试
public class PhoneFactory { public Phone makePhone(String phoneType) { if (phoneType.equalsIgnoreCase("MiPhone")) { return new MiPhone(); } else if (phoneType.equalsIgnoreCase("iPhone")) { return new IPhone(); } return null; } //测试简单工厂 public static void main(String[] arg) { PhoneFactory factory = new PhoneFactory(); Phone miPhone = factory.makePhone("MiPhone"); IPhone iPhone = (IPhone) factory.makePhone("iPhone"); } }
4.2 设计模式之模板
模板模式(Template Pattern):基于抽象类的,核心是封装算法
Spring核心方法refresh就是典型的模板方法
org.springframework.context.support.AbstractApplicationContext#refresh
模板设计模式—模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供具体实现
//模板模式 public abstract class TemplatePattern { protected abstract void step1(); protected abstract void step2(); protected abstract void step3(); protected abstract void step4(); //模板方法 public final void refresh() { //此处也可加入当前类的一个方法实现,例如init() step1(); step2(); step3(); step4(); } }
定义子类
//模板模式 public class SubTemplatePattern extends TemplatePattern { @Override public void step1() { System.out.println(">>>>>>>>>>>>>>1"); } @Override public void step2() { System.out.println(">>>>>>>>>>>>>>2"); } @Override public void step3() { System.out.println(">>>>>>>>>>>>>>3"); } @Override public void step4() { System.out.println(">>>>>>>>>>>>>>4"); } //测试 public static void main(String[] args) { TemplatePattern tp = new SubTemplatePattern(); tp.refresh(); } }
输出
4.3 设计模式之观察者
什么是观察者模式
观察者模式(Observer Pattern):当对象间存在一对多关系时,则使用观察者模式(ObserverPattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。
Spring 的事件机制就是具体的观察者模式的实现
spring中的多播与事件
AbstractApplicationContext#initApplicationEventMulticaster AbstractApplicationContext#registerListeners
观察者模式有哪些角色?
事件 ApplicationEvent 是所有事件对象的父类
,继承JDK的EventObject
事件监听 ApplicationListener ,也就是观察者对象
,继承自 JDK 的 EventListener ,可以监听到事件;该类中只有一个方法
onApplicationEvent 。当监听的事件发生后该方法会被执行。
事件发布 ApplicationContext , 实现事件的发布。(发布事件)
========================or=================================
Spring中的多播
事件发布 ApplicationEventMulticaster ,用于事件监听器的注册和事件的广播。
5 AOP用到的那些设计模式
5.1 设计模式之代理