第一章 软件架构设计原则
1.1 开闭原则
开闭原则的核心思想就是面向抽象编程
开闭原则是面向对象编程中的一个设计原则,也被称为OCP原则。它的定义为:软件中的对象(类、模块、函数等)应该对扩展开放,对修改关闭。换句话说,一个软件实体应该通过扩展来实现变化,而不是通过修改已有的代码来实现变化。
这个原则的目的是降低代码的耦合性,提高代码的可维护性和可扩展性。如果一个系统的每个模块都遵循开闭原则,那么当需要修改系统的某个功能时,我们只需要扩展那个模块,而不需要修改已有的代码。这样可以避免引入新的 bug,同时也可以减少代码的测试和维护成本。
具体来说,开闭原则的实现方法包括:
- 抽象化关键模块,通过接口或抽象类来定义模块的行为,实现模块与模块之间的松耦合;
- 封装变化,将变化隔离在模块内部,通过扩展来实现变化;
- 依赖倒置,面向接口编程,依赖于抽象而不是具体实现,提高系统的灵活性和扩展性。
java 中service ServiceImpl就采用了这种思想
//举例来说,假设我们要设计一个食品配送系统,其中有一个关键模块是订单管理模块。我们可以通过抽象化这个模块来实现开闭原则。
public interface OrderManager {
public void createOrder(Order order);
public void cancelOrder(String orderId);
public Order getOrderById(String orderId);
}
//然后,我们可以实现这个接口来创建具体的订单管理模块
public class SimpleOrderManager implements OrderManager {
public void createOrder(Order order) {
// 实现创建订单的逻辑
}
public void cancelOrder(String orderId) {
// 实现取消订单的逻辑
}
public Order getOrderById(String orderId) {
// 实现根据订单编号查询订单的逻辑
}
}
//在这个例子中,我们通过抽象化OrderManager模块,定义了它的行为,并实现了一个具体的订单管理模块SimpleOrderManager。如果我们需要扩展这个模块,比如增加一个新的功能来查询订单的历史记录,我们只需要扩展OrderManager接口,或者创建一个新的实现类来实现这个功能,而不需要修改已有的代码,从而实现了开闭原则。
在实践中,开闭原则是一个重要的设计原则,可以帮助我们编写高质量、易于维护和扩展的代码。
1.2 依赖倒置原则
依赖倒置的中心思想: 面向接口编程
高层模块
在面向对象设计中,高层模块是指那些实现系统业务逻辑、提供业务接口的模块。高层模块通常是系统中的主要功能模块,对于整个系统的运行起到了至关重要的作用,同时也是与用户交互最密切的部分。
低层模块
依赖倒置原则(Dependence Inversion Principle,DIP)是指设计代码结构时,高层模块不应该依赖低层模块,二者都应该依赖其抽象。抽象不应该依赖细节,细节应该依赖抽象。
在面向对象设计中,底层模块是指那些提供基础支持、通用功能或技术实现的模块。底层模块通常是系统中的基础设施模块,为高层模块提供了必要的支持,但本身不直接参与业务逻辑的实现。
通过依赖倒置,可以减少类与类之间的耦合性,提高系统的稳定性,提高代码的可读性和可维护性,并且能够降低修改程序所造成的风险。
接下来看一个案例,还是以 Course(课程)为例,先来创建一个类Tom:
public class Tom{
public void studyJavaCourse(){
System.out.println("Tom在学习Java的课程");
}
public void studyPythonCourse(){
System.out.println("Tom在学习Python的课程");
}
}
来调用一下
public static void main(String[] args){
Tom tom = new Tom();
tom.studyJavaCourse();
tom.studyPythonCourse();
}
Tom热爱学习,目前正在学习Java课程和Python课程。大家都知道,学习也是会上瘾的。随着学习兴趣的“暴涨”,现在Tom还想学习AI(人工智能)的课程。这时候,因为业务扩展,要从低层到高层(调用层)依次修改代码。在Tom类中增加studyAICourse()方法,在高层也要追加调用。如此一来,系统发布以后,实际上是非常不稳定的,在修改代码的同时也会带来意想不到的风险。接下来我们优化代码,创建一个课程的抽象ICourse接口:
public interface ICourse{
void study();
}
然后编写JavaCourse类:
public class JavaCourse implements ICourse{
@Override
public void stury(){
System.out.println("Tom在学习Java课程");
}
}
再实现PythonCourse类:
public class PythonCourse implements ICourse{
@Override
public void stury(){
System.out.println("Tom在学习Python课程");
}
}
修改Tom类:
public class Tom{
public void study(ICourse icourse){
icourse.stydy();
}
}
标签:代码,实现,void,模块,Tom,设计模式,public
From: https://www.cnblogs.com/cxpress/p/17359271.html