Skip to content

Latest commit

 

History

History
168 lines (97 loc) · 4.27 KB

设计模式总结.md

File metadata and controls

168 lines (97 loc) · 4.27 KB

设计模式的总结

工厂模式

​ 用户只关心结果,不需要关心制作的过程。

原型模式

​ 复制对象

代理模式

​ 找关系,帮忙做事情。

单例模式

​ 独一无二

策略模式

​ 封装内部逻辑,选择性调用。折扣计算

模板模式

​ 定义一个骨架,把一些步骤延迟到子类中实现

适配器模式

​ 解决兼容问题。如:usb转换头,苹果数据线头转换成安卓。

装饰器模式

​ 原始对象不变,增加处理能力。 如:房子装修,安装门,安装窗户,都还是房子

观察者模式

​ 监听某个行为,做出某个回应。

适配器模式

在实现上:通过继承的方式。

解释上:

把一个类的接口变成客户端所能接受的另一种接口,从而使2个不能匹配而无法使用的类,在一起使用

装饰器模式

在实现上:通过组合+静态代理的模式

解释上,把一个类通过组合的方式,让它自身不变,功能增加。

spring 中的IOC、 AOP、 DI

IOC

//ioc容器
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);

具体方法 org.springframework.beans.factory.support.DefaultListableBeanFactory#registerBeanDefinition

public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
    throws BeanDefinitionStoreException {
	...
    BeanDefinition existingDefinition = this.beanDefinitionMap.get(beanName);
    //已经存在ioc容器了
    if (existingDefinition != null) {
        //验证是否支持允许覆盖
        if (!isAllowBeanDefinitionOverriding()) {
            //不允许 抛出异常
            throw new BeanDefinitionOverrideException(beanName, beanDefinition, existingDefinition);
        }
        //允许的话,判断存在的权限是否小于需要添加的权限
        else if (existingDefinition.getRole() < beanDefinition.getRole()) {
        ...
        this.beanDefinitionMap.put(beanName, beanDefinition);
    }
    else {
        //判断工厂的bean创建阶段是否已经开始了。
        if (hasBeanCreationStarted()) {//工厂的bean创建阶段已经开始了
            // 无法再修改启动时集合元素(用于稳定迭代)
            synchronized (this.beanDefinitionMap) {
                //保存ioc容器
                this.beanDefinitionMap.put(beanName, beanDefinition);
                //新建一个修改后的存储BeanName集合
                List<String> updatedDefinitions = new ArrayList<>(this.beanDefinitionNames.size() + 1);
                //复制beanDefinitionNames集合内容到新建的BeanName集合
                updatedDefinitions.addAll(this.beanDefinitionNames);
                //保存需要添加的beanName到修改后的集合
                updatedDefinitions.add(beanName);
                //重新赋值到beanDefinitionNames集合
                this.beanDefinitionNames = updatedDefinitions;
                //单例ioc容器中是否存在需要添加的bean
                if (this.manualSingletonNames.contains(beanName)) {
                    //存在话
                    //创建一个Set集合,复制manualSingletonNames的内容
                    Set<String> updatedSingletons = new LinkedHashSet<>(this.manualSingletonNames);
                    //把BeanName从中移除掉
                    updatedSingletons.remove(beanName);
                    //再重新赋值到单例Ioc容器中
                    this.manualSingletonNames = updatedSingletons;
                }
            }
        }
        else {//没有开始的话,就直接保存
            // Still in startup registration phase
            //保存到ioc容器中
            this.beanDefinitionMap.put(beanName, beanDefinition);
            //保存到ioc-Names容器中
            this.beanDefinitionNames.add(beanName);
            //从单例Ioc容器中删除
            this.manualSingletonNames.remove(beanName);
        }
        this.frozenBeanDefinitionNames = null;
    }

    //如果普通Bean已经存在了,或者 在单例Bean已经存在了
    if (existingDefinition != null || containsSingleton(beanName)) {
        //重新刷新Bean信息
        resetBeanDefinition(beanName);
    }
}

AOP

DI