设计模式-设计原则之单一职责原则
程序员文章站
2022-06-13 14:00:54
...
类职责
代码
public class Bird {
public void mainMoveMode(String birdName) {
System.out.println(birdName + "用翅膀飞");
}
}
测试
public class Test {
public static void main(String[] args) {
Bird bird = new Bird();
bird.mainMoveMode("大雁");
bird.mainMoveMode("鸵鸟");
}
}
显然这里鸵鸟用翅膀飞是不符合事实的,那么在现有代码上修改一下Bird
为
public class Bird {
public void mainMoveMode(String birdName) {
if ("鸵鸟".equals(birdName)) {
System.out.println(birdName + "用脚走");
} else {
System.out.println(birdName + "用翅膀飞");
}
}
}
这样的代码显然是不符合单一职责原则的,每种鸟类均需要在mainMoveMode
中添加很多很多的if...else
合理代码
public class FlyBird {
public void mainMoveMode(String birdName) {
System.out.println(birdName + "用翅膀飞");
}
}
public class WalkBird {
public void mainMoveMode(String birdName) {
System.out.println(birdName + "用脚走");
}
}
测试
public class Test {
public static void main(String[] args) {
FlyBird flyBird = new FlyBird();
flyBird.mainMoveMode("大雁");
WalkBird walkBird = new WalkBird();
walkBird.mainMoveMode("鸵鸟");
}
}
接口职责
public interface ICourse {
String getCourseName();//获取课程名称
byte[] getCourseVideo();//获取课程的字节流
//----------------------------------------
void studyCourse();//学习课程
void refundCourse();//退订课程
}
上面的代码表达的是,如果学习了一门课,那么我们就可以获取这门课的课程名称和课程的视频流,但是退订这门课后我们是获取不了课程名称和课程的视频流的,那么我们需要做的是将上面的代码划分为获取课程信息和课程管理两种职责
public interface ICourseContent {
String getCourseName();//获取课程名称
byte[] getCourseVideo();//获取课程的字节流
}
public interface ICourseManager {
void studyCourse();//学习课程
void refundCourse();//退订课程
}
public class CourseImpl implements ICourseContent, ICourseManager {
public String getCourseName() {
return null;
}
public byte[] getCourseVideo() {
return new byte[0];
}
public void studyCourse() {
//TODO 学习课程
}
public void refundCourse() {
//TODO 退订课程
}
}
这样我们代码的复杂性降低了,可读性变高了,修改一个接口对另一个接口是不影响的