📜  Java中的单一职责原则与示例(1)

📅  最后修改于: 2023-12-03 14:42:56.043000             🧑  作者: Mango

Java中的单一职责原则

在面向对象编程中,"单一职责原则"(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("绘制正方形");
    }
}

现在,我们分离了不同的职责,每个类只需要关注与其自身相关的职责,而不会自相矛盾。