📅  最后修改于: 2023-12-03 14:42:56.043000             🧑  作者: Mango
在面向对象编程中,"单一职责原则"(Single Responsibility Principle 简称SRP)是指一个类应该只有一个单一的功能,并且该功能应该由这个类完全封装起来。只有一个职责的变化应该只会引起一个类的变化。
我们来看一个简单的示例,实现一个图形绘制的程序。
假设我们有如下代码:
public class Shape {
private String type;
public Shape(String type) {
this.type = type;
}
public void drawCircle() {
if ("circle".equals(type)) {
System.out.println("绘制圆形");
} else {
System.out.println("不支持的图形类型");
}
}
public void drawRectangle() {
if ("rectangle".equals(type)) {
System.out.println("绘制矩形");
} else {
System.out.println("不支持的图形类型");
}
}
public void drawSquare() {
if ("square".equals(type)) {
System.out.println("绘制正方形");
} else {
System.out.println("不支持的图形类型");
}
}
}
在这个例子中,我们可以看到Shape类承担了太多的职责,我们通过add、remove、get、set方法操作形状,也通过drawCircle、drawRectangle和drawSquare方法来绘制不同的形状。
这里违反了SRP原则,因为Shape类有两个不同的原因来发生变化:一是形状数据的变化,另一个是绘制某种形状的方式。
更好的方案是,我们应该将不同的职责分离到不同的类中去。
public interface Shape {
void draw();
}
使用接口来表示图形的基本功能,我们可以定义不同的类来实现它,例如:
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("绘制圆形");
}
}
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("绘制矩形");
}
}
public class Square implements Shape {
@Override
public void draw() {
System.out.println("绘制正方形");
}
}
现在,我们分离了不同的职责,每个类只需要关注与其自身相关的职责,而不会自相矛盾。