重学Java设计模式
学习方式:设计模式可以理解为是前辈们的经验,所以单独靠理论的看书是不行的,必须实际联系,一步步优化代码才能学好。
六大设计原则
单一职责原则
一个类应该只有一个发生变化的原因
通俗理解:
- 职责:就是指类变化的原因,也就是业务需求
- 一个class只负责一个事情
开闭原则
软件中的 对象、类、模块和函数 对 扩展 开放,对修改封闭
书例:
求圆形面积,π值的精度如果在父类写死,后面需求变化,要求更精确,这时可以让子类继承父类,直接在子类中修改父类的π值
public class CalculationArea implements ICalculationArea {
private static final double pi = 3.14d;
@Override
public double circular(double r) {
return pi * r * r;
}
}
---------------------------------------------------------------
public class CalculationAreaExt extends CalculationArea {
private static final double pi = 3.141592653d;
@Override
public double circular(double r) {
return pi * r * r;
}
}
通俗理解:不去修改原来封闭的父类代码,直接给他做扩展
里氏替换原则
如果S是T的子类型,那么所有T类型的对象都可以在不破坏程序的情况下被S类型的对象替换。
通俗理解:能放父类对象的位置,都能直接改成放子类对象
迪米特法则
又叫最少知道原则,是指一个对象类对于其他对象类来说,知道得越少越好。也就是说,两个类之间不要有过多的耦合关系,保持最少关联性。
书例:
校长要知道班级的总分、平均分,不应该在校长类中写这些接口,而应该将班级的分数交给老师管理
接口隔离原则
客户端不应该被迫依赖于它不使用的方法;一个类对另一个类的依赖应该建立在最小的接口上
书例:英雄的每个技能都当作一个接口,这样hero类在实现这些接口时就可以自己选择。比如下面例子就应该把ISkill接口拆分成三个接口,然后让HeroA实现两个接口
public class HeroA implements ISkill {
@Override
public void doArchery() {
System.out.println("A的射箭技能");
}
@Override
public void doSilent() {
System.out.println("A的沉默技能")
}
@Override
public void doVertigo() {
// 无此技能的实现
}
}
依赖倒置原则
高层模块不应该依赖于底层模块,二者都应该依赖于抽象;
抽象不应该依赖于细节,细节应该依赖于抽象;