HDIS-Framework
HDIS-Framework是一个基于SpringBoot、Kubernetes、阿里云服务,编写的一个用于支撑微服务的极速开发框架。
其文档详尽,Demo全面,设计合理,开箱即用,节省开发时间,提升开发效率。
配套的docker、Kubernetes教程已踩过各种坑,让你的微服务无障碍的顺畅运行起来。
HDIS与Kubernetes或SpringCloud配合使用,能达到最佳效果。
设计模式要解决什么问题?
设计模式要解决的问题核心为软件的:可维护性、可复用性。
- 在原有的模块上,很难加入新功能,因为加入新功能会影响到其他很多模块。
- 很难修改,因为修改也会影响到其他很多模块。
- 重复代码很多,复用率低,无法维护。
- 粘合度过高,导致类依赖的是实现本身而不是接口,无法替换原有设计。
PS:影响到替他模块时就将对软件原有代码进行修改,此时可能会给旧代码中引入错误,也可能会使我们不得不对整个功能进行重构,并且需要原有代码经过重新测试。
根本原则:开闭原则
什么是开闭原则?
一个软件实体应该对扩展开放,对修改关闭。
即:当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。
为什么说他是根本原则?
我们遵循设计模式前面5大原则,以及使用23种设计模式的目的就是遵循开闭原则。也就是说,只要我们对前面5项原则遵守的好了,设计出的软件自然是符合开闭原则的。
里氏代换原则
定义
所有引用基类的地方必须能透明地使用其子类的对象。
个人理解
- 第一层理解:使用“抽象”和“多态”将设计中的静态结构改为动态结构,在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。可以结合具体的设计模式,来理解里氏代换原则(如果没有里氏代换原则,设计模式会怎么样?)。设计模式本身就是灵活运用了里氏代换原则。
- 第二层理解:在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一个子类对象的话,那么它不一定能够使用基类对象。
- 第三层理解:子类可以扩展父类的功能,但不能改变父类原有的功能。因为继承关系增加了对象间的耦合性,所以继承时不能破坏继承体系。
依赖倒置原则
定义
- 高层模块不应该依赖低层模块,二者都应该依赖其抽象。
- 抽象不应该依赖细节,细节应该依赖抽象。
个人理解
- 依赖倒置原则基于这样一个事实:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建起来的架构比以细节为基础搭建起来的架构要稳定的多。
- 依赖倒置原则的核心思想是面向接口编程。
接口隔离原则
定义
- 客户端不应该依赖它不需要的接口。
- 一个类对另一个类的依赖应该建立在最小的接口上。
个人理解
- 接口隔离原则的含义是:建立单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少。也就是说,我们要为各个类建立专用的接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。
- 接口尽量小,但是要有限度。对接口进行细化可以提高程序设计灵活性是不挣的事实,但是如果过小,则会造成接口数量过多,使设计复杂化。所以一定要适度。
- 可以按照“角色”的概念为指导,来对接口进行细分,接口只处理此角色所涉及的操作。具体有哪些接口就看系统设计是否对角色区分清楚。
组合/聚合复用原则
定义
复用时,要尽量使用组合/聚合,尽量不要使用继承。
个人理解
只有当以下的条件全部被满足时,才应当使用继承关系。
- 子类是超类的一个特殊种类,而不是超类的一个角色,也就是区分“Has-A”和“Is-A”.只有“Is-A”关系才符合继承关系,“Has-A”关系应当使用聚合来描述。
- 永远不会出现需要将子类换成另外一个类的子类的情况。如果不能肯定将来是否会变成另外一个子类的话,就不要使用继承(里氏代换原则)。
- 子类具有扩展超类的责任,而不是具有置换掉或注销掉超类的责任。如果一个子类需要大量的置换掉超类的行为,那么这个类就不应该是这个超类的子类(里氏代换原则)。
迪米特法则
定义
一个对象应该对其他对象保持最少的了解。
个人理解
- 尽量降低类与类之间的耦合。通俗的来讲,就是一个类对自己依赖的类知道的越少越好。
- 为了实现迪米特法则。可以使用依赖倒置原则,使其依赖于抽象。
迪米特法则在设计上的体现
- 优先考虑将一个类设置成不变类
- 尽量降低一个类的访问权限
- 谨慎使用序列化
- 尽量降低成员的访问权限