面向对象设计七大原则
-
开闭原则(Open Close Principle)
面向扩展开放,面向修改关闭。
-
里氏替换原则(Liskov Substitution Principle)
超类存在的地方,子类是可以被替换的。
-
依赖倒置原则(Dependence Inversion Principle)
实现尽量依赖于抽象,而不是依赖于具体实现。
-
单一职责原则(Single Responsibility Principle)
每一个类都应该专注于做一件事情。
-
接口隔离原则(Interface Segregation Principle)
应当为客户端提供尽可能小的单独的接口,而不是提供大的总的接口。
-
迪米特原则(Law Of Demeter)
又叫最少知道原则,一个软件实体应当尽可能少的与其他实体发生相互作用。
-
组合/聚合复用原则(Composite/Aggregate Reuse Principle CARP)
尽量使用合成/聚合达到复用,尽量少用继承。原则: 一个类中有另一个类的对象。
实例一
需求:
当前有一个运算类,里面只实现了加法运算逻辑,现在需要增加一个减法运算逻辑。
public class Addition {
public void calculation(){
System.out.println("加法计算");
}
}
public class Test {
public static void main(String[] args) {
Addition obj = new Addition();
obj.calculation();
}
}
不符合设计模式写法:
public class Addition {
public void calculation(int type) {
switch (type) {
case 1:
System.out.println("加法计算");
break;
case 2:
System.out.println("减法法计算");
break;
}
}
}
public class Test {
public static void main(String[] args) {
Addition obj = new Addition();
// 加法运算
obj.calculation(1);
// 加法运算
obj.calculation(2);
}
}
符合设计模式写法:
public interface Calculation {
void calculation();
}
public class Addition implements Calculation{
public void calculation(){
System.out.println("加法计算");
}
}
public class Subtraction implements Calculation {
@Override
public void calculation() {
System.out.println("减法运算");
}
}
public class Test {
public static void main(String[] args) {
Calculation obj = new Addition();
obj.calculation();
obj = new Subtraction();
obj.calculation();
}
}
以上的代码符合了以下原则:
- 开闭原则
- 里氏替换原则
- 依赖倒置原则
实例二
目前有一个用户管理接口,里面有一个 changeUser(User user) 方法,目前这个方法只能修改用户邮箱,现在需要修改密码:
public interface UserService {
void changeUser(User user);
}
如果直接在这个方法中增加修改密码的逻辑就会违反单一职责原则,正确的做法是将 changeUser
方法再细化分为如下两个方法:
public interface UserService {
void changeUserPassword(User user);
void changeUserEmail(User user);
}