- 一、什么是设计模式
- 二、为什么要使用设计模式?
- 三、何时使用设计模式
- 四、六大设计原则
- 五、不遵循设计模式可能会导致的问题
- 六、什么是高内聚、低耦合、强耦合
- 七、业务逻辑中的设计模式及原则
- 八、框架中的常用设计模式
- 九、设计模式总结
- 十、实现和继承的区别和联系
- 十一、SOA和微服务的关联及区别
一、什么是设计模式
定义:是一套被反复使用的,多数人知晓的、经过分类编目的、代码设计经验总结
特性一:面向对象
特性二:与具体的语言无关
二、为什么要使用设计模式?
- 可扩展
- 可复用
- 可维护
-
抽象类
提高了类和类的内聚程度,减少了代码量。
三、何时使用设计模式
- 有一定代码编写经验和理解后
- 合适场景+匹配问题+清晰的解决方案
-
重构
:通过调整代码结构改善软件的质量、性能、使其程序的设计模式和架构更趋合理,提高软件的扩展性和可维护性。
四、六大设计原则
-
单一职责原则 SRP
- 有且仅有一个原因能引起类变化
- 用职责或变化和衡量
-
里氏替换原则
- 所有引用基类的地方必须能无感知的使用其子类
- 子类可扩展父类功能,但不要修改父类功能
-
依赖倒置原则
- 面向接口编程
-
接口隔离原则
- 接口尽量细化,化为最小功能单元
- 不使用接口不要依赖
-
迪米特法则
- 也叫最少知道原则,一个对象对其他对象有最少的了解
- Only talk to your Immediate friends
- 依赖、关联、聚合、组合
-
开闭原则
- 对扩展开放,对修改关闭
- 抽象约束,封装变化
五、不遵循设计模式可能会导致的问题
技术负债
:
例1:
小明需要开开发一个用户模块,其中涉及一些复杂的操作,比如用户数据接收和处理,这时小明为了省事,把多个模块之间需要交互的代码都融合到了一起,将原本需要2天的工作量,用了1天完成了。
但过了段时间,项目升级迭代,涉及接收用户数据的部分有了大的变动,这时因为原本的代码不遵循任何规范,乱糟糟的在一起,需要进行大面积的修改,甚至是删掉重写,此时工作量翻了不止倍,小明给自己挖了个巨坑,需要加班加点的填坑!
例2:
一个服务节点 5000QPS,小明在写程序的时候,处理的非常差,导致1一个节点只能有1000QPS,这时需要处理5000QPS,就需要使用5台机器才能解决问题,这就导致了成本增加
六、什么是高内聚、低耦合、强耦合
高内聚
:A模块以及拥有它应该拥有的所有功能,不需要依赖其他的模块,拆到不能再拆(微服务的最小服务、最小原子操作)
低耦合
:模块之间依赖程度较低,某一个模块变动或者是出故障的时候
例如:A模块依赖B模块,B接口依赖,B出问题,A不受影响,这是低耦合
但是如果,A同时受到影响,不能正常运行,这就是
强耦合
七、业务逻辑中的设计模式及原则
-
单一职责原则
业务分层(水平+垂直)Spring MVC、Controller、Service、Dao
-
依赖导致原则
Service、Dao等,都有接口和Impl实现类
-
迪米特法则
水平分层,如Controller和Service
-
多种模式组合使用
Dao层:Facade外观模式、Proxy代理模式、Strategy策略模式
Service层:业务自定义
八、框架中的常用设计模式
Spring中的常用的设计模式
-
Factory Pattern 工厂模式
- BeanFactory
- ApplicationContext
-
Singleton 单例模式
- ApplicationContext
-
Prototype原型模式
- scope = prototype
-
Proxy Pattern 代理模式
- AOP
-
Delegate Proxy委派模式
- DispatchServlet
- BeanDefinitionParserDelegate
-
Observer Pattern 观察者模式
- ContextLoaderListener
-
Adapter 适配器模式
- HandlerAdapter
-
Other Pattern 其他设计模式
- 策略模式、模板方法模式
Mybatis中常用的设计模式
- 工厂模式
- SqlSessionFactory
- 单例模式
- SqlSessionFactory
- 代理模式
- MapperProxy、ConnectionLogger等用了动态代理
- 模板方法模式
- BaseExecutor、SimpleExecutor、BaseTypeHandler
- 装饰者模式
- cache包里decorators下的所有decorators实现类
- 迭代器模式
- PropertyTokenizer
架构中常用的设计模式
- MVC模式
- 黑板模式
- 主从模式
- SOA模式
- 微服务模式
九、设计模式总结
经验复用 | 可扩展 | 逻辑中 |
---|---|---|
可自创 | 可复用 | 工具及框架中 |
解决问题 | 可我IE胡 | 架构中 |
UML图一定要会画,面试时如果问到设计模式,画UML是必经过程
十、实现和继承的区别和联系
首先我们都知道Java是单继承、多实现
extends:一个类继承了父类,则拥有父类的所有非私有功能,它是有具体实现功能的,所有子类从父类继承的方法都是同样的行为
Implement:接口,比较抽象,是只做定义,具有的功能交于实现类去根据需要进行不同行为
的实现
十一、SOA和微服务的关联及区别
这里说下我对SOA和微服务的理解,由于没有实际经营,如有问题,还请多多指教!
SOA:主要在于解决多服务之间相互调用的问题,也就是服务治理,根据职能将模块抽取出来,提供一个公共服务供多个模块进行调用,着重中央管理。
微服务:每个服务都是聚焦单个小型的业务功能,私有的数据库,数据去中心化,降低服务直接的耦合度,每个服务都可以独立部署,它是高内聚
、松耦合
着重分散管理