什么是设计模式
设计模式是前人对编程设计经验的总结。
指导思想
可维护性:修改功能,需要改动的地方越少,可维护性越高
可复用性:代码可以被以后复用,写出自己总结的类库
可扩展性: 添加功能无需修改原来的代码
灵活性:代码接口可以灵活调用
设计模式七大基本原则
单一职责原则:只能有一个引起类变化的原因。Java的设计中很多接口就是单一职责的,比如接口Callable,Runnable,Closeable等都是单一职责。
开闭原则: 对扩展开放,对修改关闭。基于抽象和多态
里氏替换原则:所有使用父类的地方,必须能够透明的使用子类对象。继承必须确保超类所拥有的性质在子类中仍然成立。里氏替换原则通俗来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能。也就是说:子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法。
依赖倒置原则: 面向接口编程,依赖抽象而不是依赖具体。其核心思想是:要面向接口编程,不要面向实现编程。依赖倒置原则的目的是通过要面向接口的编程来降低类间的耦合性,所以我们在实际编程中只要遵循以下4点,就能在项目中满足这个规则。
- 每个类尽量提供接口或抽象类,或者两者都具备。
- 变量的声明类型尽量是接口或者是抽象类。
- 任何类都不应该从具体类派生。
- 使用继承时尽量遵循里氏替换原则。
接口隔离原则: 每个接口应该承担独立的角色,避免子类实现不需要实现的方法,需要对客户提交最小的接口。
以学生成绩管理系统为例,学生成绩管理程序一般包含插入成绩、删除成绩、修改成绩、计算总分、计算均分、打印成绩信息、査询成绩信息等功能,如果将这些功能全部放到一个接口中显然不太合理,正确的做法是将它们分别放在输入模块、统计模块和打印模块等 3 个模块中。
迪米特法则:尽量不要和陌生人说话,和其它类的耦合度变低。也叫最少知道原则。迪米特法则中的“朋友”是指:当前对象本身、当前对象的成员对象、当前对象所创建的对象、当前对象的方法参数等,这些对象同当前对象存在关联、聚合或组合关系,可以直接访问这些对象的方法。
在运用迪米特法则时要注意以下 6 点。
- 在类的划分上,应该创建弱耦合的类。类与类之间的耦合越弱,就越有利于实现可复用的目标。
- 在类的结构设计上,尽量降低类成员的访问权限。
- 在类的设计上,优先考虑将一个类设置成不变类。
- 在对其他类的引用上,将引用其他对象的次数降到最低。
- 不暴露类的属性成员,而应该提供相应的访问器(set 和 get 方法)。
- 谨慎使用序列化(Serializable)功能。
public class UserService{ @Autowired private UserDao userDao; public void check(){ List<User> userList = userDao.getAll(); for (User user: userList) { System.out.println(user.toString()); } } }
按照定义,UserService和Use不是直接朋友,不符合迪米特法则,但是User类是UserDao类的直接朋友。
改进
public class UserService {
@Autowired
private UserDao userDao;
public void check(){
userDao.printAll();
}
}
class UserDao{
public List<User> getAll(){
return userMapper.selectAll();
}
public void printAll(){
List<User> userList = getAll();
for (User user: userList) {
System.out.println(user.toString());
}
}
}
合成复用原则:它要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。