文章目录提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、单一职责二、接口隔离三、依赖倒置(依赖倒转)四、里氏替换五、开闭原则六、迪米特法则七、合成复用总结
设计原则的核心思想
提示:以下是本篇文章正文内容,下面案例可供参考
一、单一职责对于一个类来说,即一个类应该只负责一项职责,如A类负责两个不同的职责:职责1和职责2?当职责1需求变更而改变A时可能造成职责2的执行错误,所以需要将类A的粒度分解为A1,A2
例如:每一种类型的载具都应该负责该类型的职责
违反原则示例:(示例):
public class Text {
public static void main(String[] args) {
Vehicle vehicle = new Vehicle();
vehicle.run("摩托车");
vehicle.run("汽车");
vehicle.run("飞机");
}
}
// 交通工具
class Vehicle {
public void run (String vehicle) {
System.out.println(vehicle + "在公路上跑。。。。。");
}
// 可以在此类加上其他载具的运行方法,虽然没有在类上遵守了单一职责,但是在方法上遵守了单一职责
// 这称为反单一职责原则
}
二、接口隔离
一个类对另一个类的依赖应该建立在最小的接口上
违反原则代码如下(示例):
interface A {
void one();
void two();
}
class B implements A{
@Override
public void one() {
System.out.println("one");
}
// 实现了不需要的方法
@Override
public void two() {
}
}
class C implements A{
// 实现了不需要的方法
@Override
public void one() {
}
@Override
public void two() {
System.out.println("two");
}
}
接口A有两个接口,但是B类只需要用到one接口,C类只需要用到two接口,他们必须实现他们不需要的方法
接口隔离原则应该这样处理,将接口拆分为独立的几个接口,那么B类和C类就可以分别与他们需要的接口建立依赖的关系,这就是接口隔离原则
三、依赖倒置(依赖倒转)
- 高层模块不因该依赖低层模块抽象不因该依赖细节,细节因该依赖抽象中心思想是面向接口编程
违反原则代码如下(示例):
class A {
public void send () {
}
}
class B {
// 直接依赖了A类,细节应该依赖抽象
public void t (A a) {
a.send();
}
}
四、里氏替换
- 继承包含这样一层含义:父类中凡是已经实现好的方法,实际上是在设定规范和契约,虽然不强制要求所有子类必须遵守这些契约,但是如果子类对这些已经实现的方法进行任意修改,就会对整个继承体系造成破坏继承给程序带来便利的同时,也带来了弊端。比如使用继承会给程序带来侵入性,程序的可移植性降低,增加对象的耦合,并且父类修改后,所有涉及到子类的功能有可能产生故障如何正确使用继承=>里氏替代
不用随意重写父类已经实现好了的方法
五、开闭原则
- 一个软件实体类,模块和函数应该对扩展开放,对修改关闭,用抽象构建框架,用实现扩展细节当软件需要变化是时,尽量通过扩展软件实体的行为变化,而不是通过修改已有代码来实现变化编程中遵守其他原则,以及使用设计模式的目的就是遵守开闭原则
开闭原则代码如下(示例):
interface Shape {
void draw ();
}
// 绘制形状,对扩展开放,你需要绘制什么形状实现shape接口然后就可以自由绘制了,这就是对扩展开放
class GraphicEditor {
public void drawShape (Shape s) {
}
}
对扩展开放是对软件设计说的,比如开发一款工具,对于使用方来说,他是可以扩展的
六、迪米特法则
- 一个对象应该对其他对象保持最少了解类和类关系越密切,耦合度越大迪米特法则又称最少知道原则,即一个类对自己依赖的类知道的越少越好,也就是说,对于依赖的类不管多么复杂,对外除了提供public方法,不对外泄露任何信息迪米特法则还有一个更简单的定义,只与直接朋友通信直接的朋友:每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系,我们就说这两个对象直接是朋友关系,耦合的方式有很多,依赖,关联,组合,聚合等,其中,我们称出现成员变量,方法参数,方法返回值中的类为直接朋友,而出现在局部变量中的类不是直接朋友,也就是说,陌生的类最好不要以局部变量的形式出现在类的内部
- 原则是尽量使用合成/聚合的方式,而不是使用继承
- 找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起针对接口编程,而不是针对实现编程为了交互对象之间的松耦合设计而努力



