面向对象设计七大原则
开闭原则(Open Close Principle)
java 面向扩展开放,面向修改关闭。
里氏替换原则(Liskov Substitution Principle)
java 超类存在的地方,子类是可以被替换的。
依赖倒置原则(Dependence Inversion Principle)
java 实现尽量依赖于抽象,而不是依赖于具体实现。
单一职责原则(Single Responsibility Principle)
java 每一个类都应该专注于做一件事情。
接口隔离原则(Interface Segregation Principle)
java 应当为客户端提供尽可能小的单独的接口,而不是提供大的总的接口。
迪米特原则(Law Of Demeter)
java 又叫最少知道原则,一个软件实体应当尽可能少的与其他实体发生相互作用。
组合/聚合复用原则(Composite/Aggregate Reuse Principle CARP)
java 尽量使用合成/聚合达到复用,尽量少用继承。原则: 一个类中有另一个类的对象。
实例一
需求:
当前有一个运算类,里面只实现了加法运算逻辑,现在需要增加一个减法运算逻辑。
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);
}