依赖倒置原则:高层模块(越往调用端层次越高)不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象;针对接口编程,而不针对实现编程。
优点:可以减少类间的耦合性
代码示例(未遵循依赖倒置原则):
public class Tom { public void studyJava(){ System.out.println("学习java课程"); } public void studyPython(){ System.out.println("学习python课程"); } }
代码实例(遵循依赖倒置原则):可以看出Tom只负责学习,学习的具体细节交给课程去管理
public interface ICourse { public void study(); }
public class JavaCourse implements ICourse { @Override public void study() { System.out.println("学习java课程"); } }
public class PythonCourse implements ICourse { @Override public void study() { System.out.println("学习python课程"); } }
public class Tom { public void study(ICourse course){ course.study(); } }
单一职责原则:不要存在多于一个导致类变更的原因
代码示例:这里也体现了里氏替换原则,即可以对父类方法进行扩展,但不要覆盖
public interface CourseInfo { //获取基本信息 String getCourseName(); }
public interface CourseManage { //获得视频流 byte[] getCourseVideo(); //学习课程 void studyCourse(); //退款 void refundCourse(); }
public class CourseImpl implements CourseInfo,CourseManage{ //获取基本信息 public String getCourseName(){ } //获得视频流 public byte[] getCourseVideo(){ } //学习课程 public void studyCourse(){ } //退款 public void refundCourse(){ } }
开闭原则:对扩展开放,对修改关闭
public interface ICourse { String getId(); double getPrice(); }
public class JavaCourse implements ICourse { private String id; private double price; @Override public String getId() { return this.id; } @Override public double getPrice() { return this.price; } }
public class JavaDiscountCourse extends JavaCourse { public double getDisCountPrice() { return super.getPrice() * 0.6; } }
合成复用原则:尽量使用对象组合、聚合,而不是继承关系达到软件复用的目的
代码示例:这里也体现了开闭原则
public abstract class DBConnection { public abstract String getConnection(); }
public class MySQLConnection extends DBConnection { @Override public String getConnection() { return "获取MySQL数据连接"; } }
public class ProductDao { private DBConnection dbConnection; public void setConnection(DBConnection connection){ this.dbConnection = connection; } }
迪米特原则:只和朋友打招呼
接口隔离原则:用多个专门的接口,而不是使用单一的总接口