# ImoocLol **Repository Path**: leedoris/ImoocLol ## Basic Information - **Project Name**: ImoocLol - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-05-25 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 案例Lol - 课程:Java全栈试听课¥1 - 慕课网视频链接:https://class.imooc.com/sc/77/learn ### Version1:awkward ### Version2:abstraction 接口实现 - 仍然没有解决新增需求不改变业务代码,实现开闭原则 ### Version3:factory 简单工厂模式 - 消灭了对象实例化,实现了OCP,保持了main方法的稳定性 - 但是引入了新的HeroFactory的不稳定性,HeroFactory不是稳定代码块 - switch和case - 表面上看是稳定的,因为getHero是一个静态方法,没有new对象。 - 实际上不稳定,因为HeroFactory不是抽象的接口,是具体的工厂类,虽然它不用实例化,但也不像ISkill - 通过抽象工厂优化 - 抽象工厂对工厂抽象 - 简单工厂对产品(这里是hero)的抽象 - 具体类都能考虑对其抽象 - **Spring的IOC的类似HeroFactory入口叫ApplicationContext(IOC上下文接口,抽象工厂模式)**,获取到各种各样对象 ### Version4:reflect 反射 - 计算机代码模拟现实世界中的业务行为,用户输入映射对象转换 - 正常思维,但没有用到IoC(控制反转)和DI(依赖注入)的原理 ### test 演示容器和注入 - Container容器装配类,ABC是具体的类,IC是C实现的接口 - 由容器实现装配。比如上面A有ic,A依赖的是IC接口,而不是C类,并不关心A被装配的实例化的类 - IoC概念是抽象的,讲述一种思想,并没有给出具体的实现;DI是实现IOC的一种具体的实现; - 【IoC控制反转】案例中原本是在A类中创建C,A是主控类;有了container容器之后,容器负责类的创建,因此主控方就变成了container ## 重点理论 1. 单纯的interface可以统一方法调用,但是不能统一对象实例化[Version2] 2. 面向对象主要做的两件事情就是实例化对象和调用方法(完成业务逻辑) 3. 一段代码如果要保持稳定,就不应该负责对象的实例化 - 只有一段代码中没有new的出现才能保持代码相对稳定,才能逐步实现OCP 4. 对象实例化是不可能消除的 - 把对象实例化的过程转移到其他的代码段里 [Version3] 5. 稳定的相对性:代码中总是会存在不稳定,隔离这些不稳定,保证其他代码是稳定的[Version3] - IOC:超大生产工厂,集中变动,大容器负责改变;生产对象不是IOC的全部 - 工厂模式具有IOC的雏形 6. 变化是导致软件系统代码不稳定的根本,有两种类型 - 软件业务需求、技术选择(数据库选型) - 用户输入(无法直接输入对象) 7. **配置文件属于系统外部的,而不属于代码本身** - 配置文件的变化还是符合OCP原则(类似用户输入,仅输入途径不一样) ## 概念 - IoC:Inversion of Control(控制反转) - DIP:Dependency Inversion Principle(依赖倒置) - 定义 - 高层模块不应该依赖低层模块,两者都应该依赖抽象 - 抽象不应该依赖细节 - 细节应该依赖抽象 - 分析注意 - 高低层不是指父子类,而是抽象和具体 - 依赖接口,就是倒置 - DI:Dependency Injection(依赖注入) - 容器赋值,注入值 - 注入方式[在test.A中演示] - 属性注入 - 构造注入 - 接口注入(少用了) - 容器的理解:Container里面仍然new对象实例化(讲师的观点)[test中演示] 1. 不能理解为业务系统的一部分,是系统外面部分,能保证系统里面都没有new 2. 隔离变化的地方Container 3. 引用反射能让Container没有new