• 序言:本文内容来源是公开课6期spring设计模式那一节,通过详细思考课程内容并动手敲完课程代码加深了对以下几种设计模式的理解。
  • 六大设计原则
  • 单一职责原则
  • 一个类只负责一个功能领域中的相应职责,高内聚,低耦合
  • 开闭原则
  • 对扩展开放,对修改关闭,不修改原有代码的基础上进行扩展
  • 里氏代换原则
  • 所有引用父类的地方必须能透明的使用子类的对象
  • 依赖倒转原则
  • 抽象不应该依赖于细节,细节应该依赖于抽象(不太理解)
  • 接口隔离原则
  • 接口拆分,当一个接口太大时,需要把他拆分成小的接口
  • 迪米特原则
  • 减少依赖,一个软件实体应尽可能少的与其他实体发生相互作用(不太理解)
  • 设计模式
  • 这里就不详细列举,参考常用设计模式,但是这里仅对观察者模式进行比较详细的记录。
  • 观察者模式
  • 概念:定义对象间一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知并自动更新。
  • 别称:发布/订阅,消息通知机制,事件监听,事件驱动编程
  • 示例:使用spring事件机制改造创建订单功能。
  • 原理:发布事件方法 publishEvent(),下边引用一下源码
  • 1.调用到AbstractApplicationContext.publishEvent()方法
protected void publishEvent(Object event, @Nullable ResolvableType eventType) {
		Assert.notNull(event, "Event must not be null");

		// Decorate event as an ApplicationEvent if necessary
		ApplicationEvent applicationEvent;
		if (event instanceof ApplicationEvent) {
			applicationEvent = (ApplicationEvent) event;
		}
		else {
			applicationEvent = new PayloadApplicationEvent<>(this, event);
			if (eventType == null) {
				eventType = ((PayloadApplicationEvent<?>) applicationEvent).getResolvableType();
			}
		}

		// Multicast right now if possible - or lazily once the multicaster is initialized
		if (this.earlyApplicationEvents != null) {
			this.earlyApplicationEvents.add(applicationEvent);
		}
		else {
			getApplicationEventMulticaster().multicastEvent(applicationEvent, eventType);
		}

		// Publish event via parent context as well...
		if (this.parent != null) {
			if (this.parent instanceof AbstractApplicationContext) {
				((AbstractApplicationContext) this.parent).publishEvent(event, eventType);
			}
			else {
				this.parent.publishEvent(event);
			}
		}
	}
  • 其中的核心为 multicastEvent()方法,广播事件调用SimpleApplicationEventMulticaster的 multicastEvent 方法
  • 遍历关注该事件的监听器
  • invokeListener调用监听器的onApplicationEvent方法,执行我们自己定义的业务代码。
@Override
	public void multicastEvent(final ApplicationEvent event, @Nullable ResolvableType eventType) {
		ResolvableType type = (eventType != null ? eventType : resolveDefaultEventType(event));
		Executor executor = getTaskExecutor();
		for (ApplicationListener<?> listener : getApplicationListeners(event, type)) {
			if (executor != null) {
				executor.execute(() -> invokeListener(listener, event));
			}
			else {
				invokeListener(listener, event);
			}
		}
	}
  • 模板方法模式
  • 定义一个算法的骨架,将骨架中的特定步骤延迟到子类中(特定步骤由子类实现)
  • 模板方法模式是的子类可以不改变算法的结构即可重新定义该算法的特定步骤。
  • 策略模式和工厂模式这里就不详细描述了
  • 关于以上几种策略模式的demo在我的github上,点击 我的spring-design-pattern项目 查看demo

文末反思:

1.我太菜了,学习态度不好,作业没能及时完成。

2.希望接下来这段时间可以调整好状态,把课程尽可能补上,多写代码实践。

3.八月份目标:完成手写rpc框架。