目录
一、单一职责原则
1.理解
就是面向对象的思想,每个对象只需要负责好自己的事情,例如此时有一个People类,里面有一些方法,比如送外卖、打螺丝、摸鱼,这些虽然都属于人类的行为,但这样写的话类会显得极为臃肿,此时我们创建外卖员类和打工人类,送外卖就是外卖员的行为,打螺丝和摸鱼就是打工人的行为,这样就划分出了每个类的职责。
二、开闭原则
1.理解
“对扩展开放,对修改关闭,强调使用抽象接口进行架构,通过实现类来扩展细节”,其实不太好理解,通俗易懂来说就是提供一个接口或者抽象类,通过多个实现类去实现,然后提供一种热插拔的效果。
例如搜狗输入法的换皮肤功能,皮肤的提供者可能是厂商A或厂商B,此时搜狗输入法就可以为不同厂商提供一个统一的接口,然后厂商去实现这个接口以更换自己的皮肤。和Web开发中MVC架构类似,例如service层,我们要先定义接口,然后去实现这个接口,只不过大多数情况下我们的接口和实现类是1:1的。实现热插拔的效果的话,接口和实现类比例为1:n。
2.搜狗输入法案例
/**
* 抽象皮肤类
*/
public abstract class AbstractSkin {
public abstract void display();
}
/**
* 默认皮肤类
*/
public class DefaultSkin extends AbstractSkin {
@Override
public void display() {
System.out.println("我是默认皮肤");
}
}
/**
* 黑马皮肤类
*/
public class HeiMaSkin extends AbstractSkin {
@Override
public void display() {
System.out.println("我是黑马皮肤");
}
}
/**
* 搜狗输入法类
*/
public class SouGouInput {
private AbstractSkin skin;
public void display() {
skin.display();
}
public void setSkin(AbstractSkin skin) {
this.skin = skin;
}
}
/**
* 开闭原则:对扩展开放,对修改关闭。实现热插拔。我们需要使用到接口或者抽象类
*/
public class Test {
public static void main(String[] args) {
//1.创建搜狗输入法
SouGouInput souGouInput = new SouGouInput();
//2.插入默认皮肤
souGouInput.setSkin(new DefaultSkin());
//3.展示
souGouInput.display();
//4.替换成黑马皮肤
souGouInput.setSkin(new HeiMaSkin());
//5.展示
souGouInput.display();
}
}
三、里氏替换原则
1.理解
“父类出现的地方,子类也一定可以出现;子类可以拓展父类的功能,但不能重写父类原有的功能”。
2.四边形案例
刚开始学面向对象编程的时候,一直是通过extends长方形去实现的正方形,但是这样就不符合里氏替换原则,因为实现正方形的时候重写了长方形已经实现好了的方法。此时我们可以单独抽象出来一个四边形接口或者抽象类,然后正方形和长方形都去实现这个接口,这时对于四边形接口来说,我们只是对其进行了扩展,而不是重写覆盖了原有的功能。
/**
* 四边形
*/
public interface Quadrilateral {
double getLength();
double getWidth();
}
public class Rectangle implements Quadrilateral {
private double length;
private double width;
@Override
public double getLength() {
return this.length;
}
@Override
public double getWidth() {
return this.width;
}
public void setLength(double length) {
thi